2013-02-12 50 views
1

我已經創建了一個Login活動,它使用另一個類 - LoginService,它是一個用於網絡通信的AsyncTask。如何將結果從asynctask返回給android中的活動?

public void onClick(View view) { 

      if (editTextPassword.getText().toString() != null & editTextUsername.getText().toString() != null){ 

       new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString()).execute(); 

       if(loginSuccess!=false){ 
       //Used to move to the Cases Activity 
       Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class); 
       startActivity(casesActivity); 
       }else{ 
        Toast.makeText(getApplicationContext(),"Incorrect Details", Toast.LENGTH_LONG).show(); 
       } 
      } 
      else{ 
       //Display Toaster for error 
       Toast.makeText(getApplicationContext(),"Please enter your details", Toast.LENGTH_LONG).show(); 
      } 
     } 

在LoginService完成執行之前,活動已經通過Intent變量移動到另一個活動。我不懂爲什麼。 LoginService的想法是驗證用戶的憑證。如果它返回true,那麼它可以切換到其他活動。

回答

3

老assignement loginSuccess你不希望這樣做這樣的。 .execute()將盡快開始,但不保證(也可能保證而不是),它會及時將您的loginSuccess值返回給您。

new LoginService(...).execute();

一切都應該被轉移到onPostExecute()

private Context mContext = null; 
public void setContext(Context context) { 
    mContext = context; 
} 
@Override 
protected void onPostExecute(Void result) { 
    if(loginSuccess!=false){ 
     //Used to move to the Cases Activity 
     Intent casesActivity = new Intent(mContext, CasesActivity.class); 
     startActivity(casesActivity); 
    }else{ 
     Toast.makeText(mContext,"Incorrect Details", Toast.LENGTH_LONG).show(); 
    } 
} 

然後,你必須調用setContext()像這樣:

LoginService service = new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString()); 
service.setContext(getApplicationContext()); 
service.execute(); 
+0

好的,thx的信息。但是我在意圖代碼行中遇到了「getApplicationContext()」錯誤。如何從asyncTask類創建上下文? – mokko211 2013-02-12 23:43:05

+0

嗯,我通常把'AsyncTask's作爲內部類來保持良好的關聯。你可以做的是做一個'LoginService'的'.Context()'函數,然後在'execute()'前調用它,並將它作爲成員變量存儲。如果你願意,我可以編輯我的帖子以瞭解更多細節。 – Eric 2013-02-12 23:52:54

+0

是的。我以前從未使用過或理解過上下文的概念。這將非常感激。 – mokko211 2013-02-12 23:54:49

1

你應該將

Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class); 
      startActivity(casesActivity); 
      }else{ 
       Toast.makeText(getApplicationContext(),"Incorrect Details",  Toast.LENGTH_LONG).show(); 
      } 

到login服務的onPostExecute。

通過這種方式,您可以確定asynctask已完成其工作。

在任何情況下這是相當奇怪的其他活動得到啓動,這可能是因爲真正的

1

如何從的AsyncTask返回的結果?

onPostExecute()趕上AsyncTask的結果。

@Override 
public void onPostExecute(Boolean result) 
{ 
    boolean loginSuccess = result; 

    if(loginSuccess!=false) { 

     Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class); 
     startActivity(casesActivity); 
    } 
    else { 

     Toast.makeText(getApplicationContext(),"Incorrect Details", Toast.LENGTH_LONG).show(); 
    } 

} 

AsyncTask中結果的數據類型取決於3rd Type參數。

有時候我們認爲​​方法AsyncTask會返回一個錯誤的結果。它將返回一個AsyncTask本身

+0

Thx。但是我現在對於Intent的getApplicationContext()參數有個問題。 我不太瞭解上下文的目的。 – mokko211 2013-02-12 23:51:29

+0

它們都是'Context'的實例,但應用程序實例與應用程序的生命週期相關聯,而Activity實例與Activity的生命週期相關聯。你可以在'AsyncTask'中傳遞上下文 – Geros 2013-02-12 23:53:59

相關問題