簡體   English   中英

android-僅在asynctask完成后才完成當前活動

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

我已經通過接口和回調函數實現任務。 當用戶輸入錯誤的帳戶時,將顯示錯誤消息,並且此時沒有錯誤。 但是,不幸的是,當用戶成功登錄時,該應用程序停止了。

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

錯誤:---------崩潰開始

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)

你的

AsyncResponse委托= 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM