2010-03-04 50 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