- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个简单的一键式应用程序。该应用程序显示一个调用电话的按钮。我无法清楚地将代码重构为 MVP 架构。有一个类似的 SO 问题 ( What's the best way to check for permissions at runtime using MVP architecture? )。但是,在这个问题中,答案不够明确,无法将其应用于我的问题。
权限请求在演示者的 View 中未被识别。我遇到的问题是在 startActivity(intent); 的 View 中。 Android Studio 用红色强调了 Intent 并告诉我“调用需要可能被用户拒绝的权限。代码应该明确检查权限”。
为什么这种重构是错误的,我该如何纠正它以遵守 MVP 架构?
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void BtnSetEmergency_onclick(View view) {
String number = "1112223333";
final int REQUEST_PHONE_CALL = 1;
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "One Button App", LENGTH_SHORT).show();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else{
startActivity(intent);
}
return;
}
startActivity(intent);
}
}
我重构为 MVP 架构的尝试
查看
public class MainActivity extends AppCompatActivity {
mainActivityPresenter mainActivityPresenterObject = new mainActivityPresenter();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void BtnSetEmergency_onclick(View view) {
boolean phonePermissions = false;
String number = "1112223333";
final int REQUEST_PHONE_CALL = 1;
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
phonePermissions = mainActivityPresenterObject.checkPhonePermissions(view);
if(phonePermissions == true){
startActivity(intent);
}else if (phonePermissions == false){
}
}
}
演示者
public class mainActivityPresenter {
public boolean checkPhonePermissions(View view){
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this "One Button App", LENGTH_SHORT).show();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
return false;
}
else
{
return true;
}
}
return false;
}
}
============================================= ============>
编辑:应用基于 Nilesh Rathod 答案的最终答案
============================================= ============>
查看
public class MainActivity extends AppCompatActivity {
mainActivityPresenter mainActivityPresenterObject = new mainActivityPresenter();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void BtnSetEmergency_onclick(View view) {
boolean phonePermissions = false;
int number = 1112223333;
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + Integer.toString(number)));
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
== PackageManager.PERMISSION_GRANTED) {
startActivity(intent);
}else {
mainActivityPresenterObject.checkPhonePermissions(view, MainActivity.this);
}
}
}
演示者
public class mainActivityPresenter {
final int REQUEST_PHONE_CALL = 1;
public void checkPhonePermissions(View view, MainActivity mainActivity){
ActivityCompat.requestPermissions(mainActivity, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
}
最佳答案
"Call requires permission which may be rejected by the user. The code should explicitly check for permissions"
它的行为符合预期。
调用startActivity(intent);
仅供引用
您可以使用 ActivityCompat.OnRequestPermissionsResultCall
处理权限对话框的结果
This interface is the contract for receiving the results for permission requests
试试这个
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
== PackageManager.PERMISSION_GRANTED) {
startActivity(intent);
}else {
// ask here for call permission
}
关于java - 安卓 3.1 : Refactoring Button Code and Permissions to MVP Architecture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49745115/
我经常从专业人士的博客中听到一些事情,比如一有机会就重构你的代码。究竟是什么?用更简单和更少的行重写您的代码?这样做的目的是什么? 最佳答案 Refactoring代码是一个清理代码、减少困惑并提高可
我的代码非常困惑,当前的修订版几乎完成了,这意味着我想要的此修订版/冲刺的所有功能都已完成。 我应该按原样完成此修订并稍后重构它还是应该立即重构它? 最佳答案 这个没有“正确”的答案,真的是轻重缓急的
在我的部门,我们目前正在使用 ReSharper 4.0,并决定是否在下周发布时升级到 4.5。我个人是 ReSharper 的忠实粉丝,但我的一些同事指出,他们一直在使用来自 DevExpress
关于 TDD 中的红色、绿色、重构 (RGR) 工作流程的文章建议您在需要时通过编写“有罪的”代码来快速实现绿色(Kent Beck 举例说 TDD 中的“快速绿色为所有罪恶找借口”),然后重构以改进
我正在使用 clojure-maven-plugin。当我执行 cider-connect 时,我收到此消息“警告:clj-refactor 和 refactor-nrepl 不同步。它们的版本分别为
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
我的开发环境是 Visual Studio 2010,安装了 Resharper 5.1.3000.12 和 AnkhSVN 2.1.10129.17。 我的理解是,当对文件执行 Refactor->
我想使用重构浏览器以编程方式将实例变量添加到现有类: | theClass className | className := #MyClass. theClass := (RBClass existi
你喜欢你的 CRUD 程序吗?代码生成、框架驱动还是手动编写? 最佳答案 我对代码生成器的经验是它们是一个好的开始,但是在更改完成后,我通常想手动重写模块。当然,这可能会成为维护问题。但这真的变成了“
考虑: if (something) { // Code... } 安装 CodeRush 后,建议执行以下操作: if (!something) { return; } // Cod
我想生成一个序列,稍后我可以对其进行(映射)。它应该看起来像这样: ((0 0) (0 1) (0 2) (0 3) ... (7 7)) 为了产生如此简单的结果,我现在必须执行的这段代码看起来非常非
我对编程还是很陌生,我想编写尽可能干净的代码。 这听起来像是一个愚蠢的问题,但我应该按什么顺序排列我的方法?功能上当然没关系,但布局却有很大的不同。假设我们在一个类中有以下代码: -(void)tes
是否有任何实证研究表明重构(或缺乏重构)对开发团队生产力的影响? (注意:我只是在寻找经验数据——根据我自己的经验,我个人知道重构是有效的,但我想知道是否有一些确凿的数据来支持这种说法)。 最佳答案
假设我有一个包含一堆相互依赖的函数的库,这个库太大了,我想把它拆分。有哪些算法可以找到合适的分区? 简单的例子,里面有四个函数:alpha,beta,gamma,delta。 beta 和 gamma
我正在阅读 Fowler 的“重构”,第 1 章。 在第 51 页上,您看到一部附有价格等级的电影。第一种方法是:使用继承来创建多部电影,每部电影都有其独特的 getCharge 方法来计算价格。在第
假设您在某个地方工作,其中对源代码的每次更改都必须与错误报告或功能请求相关联,并且无法对该政策进行改革。在这样的环境中,处理代码重构(即改进代码但不修复错误或添加功能的更改)的最佳方法是什么? 编写错
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: What's the best way to do a bulk namespace rename on a lar
我重构了我和其他人的代码 一直 . 当我在一个分支而不是在 Trunk 中工作时,这有时会导致一些非常痛苦的合并,特别是如果我不定期合并回 Trunk(分支上的代码慢慢地从 Trunc 移开,当人们修
我作为程序员工作的 IT 部门围绕着 30 多年的代码库(Fortran 和 C)。代码状况不佳的部分原因是 30 多年的临时考虑不周的更改,但我也怀疑其中很多与进行更改的程序员的能力有关(顺便说一句
为了能够维护我编写的代码,我必须很好地命名变量,记录我的代码,确保没有重复发生,确保抽象在起作用,从而避免黑客攻击..并谨慎地注释,因为注释经常打断我阅读本书的内容。码。 但是我见过的许多其他代码库更
我是一名优秀的程序员,十分优秀!