java - 如何将可重用功能移动到泛型类并从那里调用另一个活动?
问题描述
我是 Android 开发的新手,在从具有可重用函数的通用类中调用活动时遇到问题。
我有 MainActivity 我需要检查应用程序是否具有网络连接,然后检查用户是否已经登录。
如果用户已登录,我需要打开 Rate 活动,否则我将打开 Login 活动。
我想我可以保留检查网络连接并显示可重用弹出窗口的逻辑并将其移动到 Global 类,如下所示
public class Global extends AppCompatActivity {
public static boolean hasConnectivity = false;
public static boolean userSignedIn = false;
String TAG = "Debug Log - Helper";
Context context;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
context = this;
}
private void networkConnectionErrorDialog(final Context context, final Class targetClass){
Log.d(TAG, "Show Alert Dialog");
new AlertDialog.Builder(context)
.setTitle(R.string.connection_error_title)
.setMessage(R.string.connection_error_message)
.setIcon(R.drawable.warning)
.setPositiveButton(
R.string.try_again,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d(TAG, "Trying Again");
isNetworkAvailable(context, targetClass);
}
}).show();
}
protected void isNetworkAvailable(Context context, Class targetClass) {
if(NetworkUtil.isConnected(context)){
Log.d(TAG, "Has connectivity");
if(targetClass != null){
Log.d(TAG, targetClass.toString());
Intent targetIntent = new Intent(context, targetClass);
startActivity(targetIntent);
}
hasConnectivity = true;
return;
}else{
Log.d(TAG, "Has no connectivity");
hasConnectivity = false;
networkConnectionErrorDialog(context, targetClass);
}
}
}
我从调用 isNetworkAvailable() 的 MainActivity 将 targetClass 作为 Login.class 或 Rate.class (基于用户登录状态)传入。
我收到以下错误。有人可以帮我解决问题并帮助我了解我的方法是否需要改进吗?
java.lang.RuntimeException: Unable to resume activity {com.solitontech.dayatsoliton/com.solitontech.dayatsoliton.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3581)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
at android.app.Activity.startActivityForResult(Activity.java:4488)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:4445)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4806)
at android.app.Activity.startActivity(Activity.java:4774)
at com.solitontech.dayatsoliton.Global.isNetworkAvailable(Global.java:50)
at com.solitontech.dayatsoliton.MainActivity.onResume(MainActivity.java:68)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1355)
at android.app.Activity.performResume(Activity.java:7117)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3556)
解决方案
看起来您的应用程序在活动的 onResume 方法中遇到空指针异常。如果您调用了 startActivityForResult,请确保
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{..}
在处理它之前是非空的。
至于您关于从帮助类 Global 开始活动的问题,您可以定义这样的函数。
private static void goToActivity(Context context, Class<?> activityClass){
Intent intent = new Intent(context, activityClass);
context.startActivity(intent);
}
您可以如下调用此方法。
goToActivity(context,TargetActivity.class);
祝你好运。
推荐阅读
- python - __init__() 得到了一个意外的关键字参数“extra_args”`
- powerbi - 索引列 2 的倍数
- angular - Angular 订阅方法的值未定义
- react-native - React Native 中的 this.setState 超出了最大更新深度
- terraform - terraform 13 到 14 不支持的属性 aws_provider
- html - 在 Gatsby 中使用带有 imgStyle 的 CSS
- c++ - 有没有办法在销毁链表时取消引用 nullptr 时停止接收异常错误?
- html - Div 模块左右边距在响应式设计中不起作用
- javascript - 从文本框中获取值不会给出单行字符串?
- php - 连接错误 08001:[unixODBC][Teradata][ODBC] (10380) 无法与数据源建立连接。缺少设置:PHP 中的 {[DBCName]}