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

时间:2016-08-04 05:45:41

标签: android android-asynctask

我通过接口和回调函数实现任务。当用户帐户出错时,会出现错误消息,此时没有错误。但是,当用户成功登录时,应用程序停止运行。

爪哇:

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);
            }
        }
    }
}

错误:        ---------崩溃的开始

  

08-04 05:53:11.807 2667-2667 / com.example.kwei.minigame1   E / AndroidRuntime:致命异常:主要                                                                             处理:com.example.kwei.minigame1,PID:2667                                                                             java.lang.NullPointerException:尝试调用接口方法   &#39; void com.example.kwei.minigame1.AsyncResponse.processFinish()&#39;在...上   null对象引用                                                                                 在   com.example.kwei.minigame1.BackgroundTask.onPostExecute(BackgroundTask.java:132)                                                                                 在   com.example.kwei.minigame1.BackgroundTask.onPostExecute(BackgroundTask.java:26)                                                                                 在android.os.AsyncTask.finish(AsyncTask.java:636)                                                                                 在android.os.AsyncTask.access $ 500(AsyncTask.java:177)                                                                                 在   android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:653)                                                                                 在android.os.Handler.dispatchMessage(Handler.java:102)                                                                                 在android.os.Looper.loop(Looper.java:135)                                                                                 在android.app.ActivityThread.main(ActivityThread.java:5254)                                                                                 at java.lang.reflect.Method.invoke(Native Method)                                                                                 在java.lang.reflect.Method.invoke(Method.java:372)                                                                                 在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)                                                                                 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

1 个答案:

答案 0 :(得分:1)

你的

  

AsyncResponse delegate = null;

delegate为空。你还没有初步确定它!

修改

制作构造函数

  public AsyncResponse delegate;

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

现在使用

执行异步任务
  BackgroundTask backgroundTask = new BackgroundTask(new AsyncResponse()......);
  backgroundTask.delegate = this;// Comment this 
  backgroundTask.execute("login",user_ac_s,user_pw_s);

this关键字定义了您案例中的活动上下文,但实际上您需要获取AsyncResponse