2010-03-04 104 views
4

我一直在研究一個應用程序,並且設法使AsyncTask在內部類中正常工作。外部類中的Android AsyncTask

現在,我正在重構代碼,以便AsyncTask處於獨立的類中,但我想知道,如何在成功完成任務後終止ProgressDialog並啓動新的活動?我試過在onPostExecute(..)方法中開始一個新的活動,但我知道這是行不通的。


通過我的UI線程活動中的構造函數的AsyncTask的說法似乎並沒有工作:

//In UI Thread I had 
public class Test101 extends Activity { 
    private Button btnLogin; 
    private LoginTask mLoginTask; 
    private Context context=this; 
    private Test101 mTest101; 

    mLoginTask=new LoginTask(context,mTest101); 
    mLoginTask.execute(null); 

    // In the AsyncTask I had 
    Activity mParentActivity; 

    public LoginTask(Context context,Activity act){ 
     this.ctx=context; 
     this.mParentActivity=act; 
    } 

    onPostExecute(..){ 
     mParentActivity.callSomeMethod(); 
    } 

    ... 
} 

我一直得到一個NullPointerException,也許我失去了一些東西,但是這沒」爲我工作。

+0

取得了良好的量的進步,這是我到目前爲止,在onPostExecute(字符串結果)方法我駁回progressDialog,現在我想傳遞的AsyncTask的結果返回給活動中UI線程。還沒有弄清楚那個部分: @Override protected void onPostExecute(String result){ pDialog.dismiss(); //將AsyncTask的結果傳遞給UI線程中的Activity? } – jwesonga 2010-03-04 17:36:33

回答

0

將Activity作爲構造函數參數傳遞給AsyncTask並將其保留在字段中。這實際上是內部類得到你的東西(只有編譯器會爲你編寫代碼)。

+0

我修改我的AsyncTask構造函數: 公共LoginTask(上下文的背景下,活動斧){ \t \t超(); \t \t this.ctx = context; \t \t this.mActivity = ax; \t} 然後在onPostExecute()我試着開始一個新的活動: mActivity.startActivity(i); 我得到一個空指針異常 – jwesonga 2010-03-08 09:49:03

6

都是一個需要開始一個新的活動是您在AsyncTask的構造函數傳入上下文對象:

private Context ctx; 
private ProgressDialog pDialog; 
private String r=""; 

public LoginTask(Context context){ 
    super(); 
    this.ctx=context; 
} 

@Override 
protected void onPostExecute(String result) { 
    Log.i("LOGGER", "Done..."); 
    pDialog.dismiss(); 
    Intent i=new Intent(ctx,SillyActivity.class); 
    ctx.startActivity(i); 
} 

如果您通過在AsyncTask在構造函數中的活動,並試圖調用startActivity(Intent intent)你將總是得到一個空指針異常。

7

不是傳遞2個參數的傳遞只有一個這樣的:

public class Test101 extends Activity { 
    private Button btnLogin; 
    private LoginTask mLoginTask; 

    mLoginTask=new LoginTask(this); 
    mLoginTask.execute(); 
    //Instead of sending null put the 1st parameter of the AsyncTask as Void 

的AsyncTask代碼:

Activity mParentActivity; 

public LoginTask(Activity act){ 
    this = act; 
} 

onPostExecute(..){ 
    ((Test101)mParentActivity).callSomeMethod(); 
} 
+0

偉大的解決方案!非常感謝你。 – dotty 2012-07-02 19:06:34

+0

@NeTeInStEiN:是否將'Activity'作爲參數傳遞給''Context LoginTask(Context context){...}'? – ChuongPham 2014-12-07 15:05:18

+0

不可以。您應該傳遞應用程序上下文以避免泄漏。但是,如果您需要回撥,則需要將參考傳遞給它。 – neteinstein 2014-12-09 10:55:56

0

使用的Android註解的AsyncTask方便,快捷,簡單!

0

mTest101未啓動。 它只是空的...所以你只能看到空指針異常,這是普通的事情。或者你可以讓靜態方法在沒有啓動類的情況下正常工作。

1
step 1 : create your master class and declare 

mNetworkMaster.runForgetAsync(); 

step 2: write another class for AsyncTask 

package com.example.xxx; 

import java.util.HashMap; 
import java.util.Map; 

import android.app.Activity; 
import android.os.AsyncTask; 

public class NetworkMaster { 

    Activity mMasterActivity; 
    LoadingDialog objLoadingDialog; 
    Map<String, String> serverUrls = new HashMap<String,String>(); 


    // create a constructor 
    public NetworkMaster(Activity mMasterActivity){ 

     this.mMasterActivity = mMasterActivity;  

    }// end constr NetworkMaster 


    // Method to run the Async task 
    public void runForgetAsync(){ 

     new ForgetPasswordAsync().execute(); 

    }// end runForgetAsync 


    // dynamically call the thread 
    public class ForgetPasswordAsync extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 

     } 

     protected String doInBackground(String... urls) { 

      serverUrls = Ipsum.getServerUrls();  

      int response = HttpRequest.post().send("name=xxxx").code(); 

      return ""+response; 
     } 

     protected void onPostExecute(String result) { 

      // return the result to master activity 
      ((Login)mMasterActivity).ForgetPassword(result);    

     } 

    }// end ForgetPasswordAsync 

}// end NetworkMaster