简体   繁体   English

android-仅在asynctask完成后才完成当前活动

[英]android - finish the current activity only after the asynctask finishes

I have implement task by interface and callback function. 我已经通过接口和回调函数实现任务。 When the user got account wrong, the error message comes up and there are no errors at that point. 当用户输入错误的帐户时,将显示错误消息,并且此时没有错误。 However, the app stops unfortunately when the user login successfully. 但是,不幸的是,当用户成功登录时,该应用程序停止了。

Java: Java:

public interface AsyncResponse {
    void processFinish();
} 

// start this activity from MainActivity when the button is pressed
public class login extends AppCompatActivity implements AsyncResponse{
    ...
    BackgroundTask backgroundTask = new BackgroundTask(this);
    backgroundTask.delegate = this;
    backgroundTask.execute("login",user_ac_s,user_pw_s);

    public void processFinish(){
        if(!MainActivity.user_ID.equals("0"))
            finish();
    }
}

public class BackgroundTask extends AsyncTask<String, Void, String>{ 
    ...
    public AsyncResponse delegate = null;
    ...
    protected void onPostExecute(String result) {
        super.onPreExecute();
        if(task.equals("get_userID")){
            MainActivity.user_ID = result;
            delegate.processFinish();
        }
        if(task.equals("register") || task.equals("login")){
            Toast.makeText(context,result,Toast.LENGTH_LONG).show();
            if(result.contains("success")){
                BackgroundTask get_userID_task = new BackgroundTask(context);
                get_userID_task.execute("get_userID",user_ac);
            }
        }
    }
}

Error: --------- beginning of crash 错误:---------崩溃开始

08-04 05:53:11.807 2667-2667/com.example.kwei.minigame1 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.kwei.minigame1, PID: 2667 java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.kwei.minigame1.AsyncResponse.processFinish()' on a null object reference at com.example.kwei.minigame1.BackgroundTask.onPostExecute(BackgroundTask.java:132) at com.example.kwei.minigame1.BackgroundTask.onPostExecute(BackgroundTask.java:26) at android.os.AsyncTask.finish(AsyncTask.java:636) at android.os.AsyncTask.access$500(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com. 08-04 05:53:11.807 2667-2667 / com.example.kwei.minigame1 E / AndroidRuntime:致命例外:主进程:com.example.kwei.minigame1,PID:2667 java.lang.NullPointerException:尝试调用接口com.example.kwei.minigame1上com.example.kwei.minigame1.BackgroundTask.onPostExecute(BackgroundTask.java:132)上的空对象引用上的方法'void com.example.kwei.minigame1.AsyncResponse.processFinish()'。 android.os.AsyncTask.finish(AsyncTask.java:636)的BackgroundTask.onPostExecute(BackgroundTask.java:26)android.os.AsyncTask.access $ 500(AsyncTask.java:177)android.os.AsyncTask $ InternalHandler。 android.os.Handler.dispatchMessage(Handler.java:102)的handleMessage(AsyncTask.java:653)android.app.ActivityThread.main(ActivityThread.java)的android.os.Looper.loop(Looper.java:135)的handleMessage(AsyncTask.java:653) :5254),位于java.lang.reflect.Method.invoke(本机方法),位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit)的java.lang.reflect.Method.invoke(Method.java:372)处.java:903)。 android.internal.os.ZygoteInit.main(ZygoteInit.java:698) android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Your 你的

AsyncResponse delegate = null; AsyncResponse委托= null;

delegate is null. delegate为空。 You haven't initialized that ! 您尚未初始化!

Edit: 编辑:

Make constructor 使构造函数

  public AsyncResponse delegate;

  public BackgroundTask(AsyncResponse delegate){
    this.delegate = delagate;
  }

Now execute your async task with 现在使用以下命令执行异步任务

  BackgroundTask backgroundTask = new BackgroundTask(new AsyncResponse()......);
  backgroundTask.delegate = this;// Comment this 
  backgroundTask.execute("login",user_ac_s,user_pw_s);

this keyword defines the activity's context in your case but actually you need to get for AsyncResponse . this关键字在您的情况下定义了活动的上下文,但是实际上您需要获取AsyncResponse

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM