4

我一直在开发一个应用程序,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,也许我错过了一些东西,但这对我不起作用。

4

6 回答 6

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

异步任务代码:

  Activity mParentActivity;

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

onPostExecute(..){
    ((Test101)mParentActivity).callSomeMethod();
}
于 2011-01-28T01:33:27.893 回答
6

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

于 2010-03-08T10:45:21.857 回答
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
于 2014-09-24T11:51:28.740 回答
0

使用 Android Annotations for AsyncTask 简单、快速、简单!

于 2012-11-26T19:01:08.840 回答
0

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

于 2013-04-27T13:47:31.147 回答
0

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

于 2010-03-07T18:49:32.870 回答