首页 > 解决方案 > 如何将可重用功能移动到泛型类并从那里调用另一个活动?

问题描述

我是 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)

标签: javaandroidandroid-intentandroid-activity

解决方案


看起来您的应用程序在活动的 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);

祝你好运。


推荐阅读