【问题标题】:Android AsyncTask in external class外部类中的 Android AsyncTask
【发布时间】:2011-01-23 16:01:36
【问题描述】:

我一直在开发一个应用程序,并且我设法让AsyncTask 在内部类中正常工作。

现在,我正在重构代码,以便 AsyncTask 位于它自己的一个单独的类中,但我想知道,一旦任务成功完成,我如何杀死 ProgressDialog 并启动一个新的 Activity?我已经尝试在 onPostExecute(..) 方法中启动一个新的 Activity,但我知道这行不通。


在 AsyncTask 的构造函数中将我的 UI 线程活动作为参数传递似乎不起作用:

//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,也许我遗漏了一些东西,但这对我不起作用。

【问题讨论】:

  • 取得了很大的进展,这是我到目前为止所取得的进展,在 onPostExecute(String result) 方法中我关闭了 progressDialog,现在我正在尝试将 AsyncTask 的结果传递回UI 线程中的活动。还没有弄清楚那部分:@Override protected void onPostExecute(String result) { pDialog.dismiss(); //将AsyncTask的结果传回UI线程中的Activity???? }

标签: android asynchronous android-asynctask


【解决方案1】:

像这样只传递一个参数,而不是传递 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

异步任务代码:

  Activity mParentActivity;

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

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

【讨论】:

  • 很好的解决方案!非常感谢。
  • @NeTeInStEiN: 是否将Activity 作为参数传递而不是将其作为Context 传递,例如public LoginTask(Context context){...}
  • 没有。您应该传递应用程序上下文以避免泄漏。但是如果需要回调,则需要将引用传递给它。
【解决方案2】:

启动一个新的Activity只需要你在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),您将始终得到空指针异常。

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      【解决方案4】:

      将 Activity 作为构造函数参数传递给 AsyncTask 并将其保存在字段中。这实际上就是作为一个内部类给你带来的东西(只有编译器会为你编写代码)。

      【讨论】:

      • 我将 AsyncTask 构造函数修改为: public LoginTask(Context context,Activity ax){ super(); this.ctx=上下文; this.mActivity=ax;然后在 onPostExecute() 我试着开始一个新的活动: mActivity.startActivity(i);我有一个空指针异常
      【解决方案5】:

      轻松、快速、简单地为 AsyncTask 使用 Android 注释!

      【讨论】:

        【解决方案6】:

        mTest101 未启动。 它只是空......所以你只能看到空指针异常,这是普通的事情。或者你可以让静态方法在不启动类的情况下正常工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 2014-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多