AsyncTask完成后完成调用活动

时间:2011-12-24 09:52:32

标签: android android-asynctask android-activity android-context

我的通话活动:

public class Hello extends Activity {  

public void onCreate(Bundle savedInstanceState) {

    MyTask mt = new MyTask(this);
    mt.execute();
}

现在在MyTask(外部类)中:

public class MyTask extends AsyncTask<Void, Void, Void> {
private Context mContext;

public MyTask(Context context) {

    mContext = context;
}  

//doinbackground, etc

    protected void onPostExecute() {
    mContext.finish();

}

如果我删除上面的mContext.finish(),其他内容正在按预期工作 但是如果我正在调用mContext.finish(),我会收到一个错误:The method finish() is undefined for the type Context(当我编写mContext时,Eclipse没有显示finish()。这表明我错误地使用了finish()。 )

Hello完成任务后,我需要做什么才能完成调用活动MyTask

6 个答案:

答案 0 :(得分:20)

((Activity)mContext).finish();

Context投射到Activity并调用其finish()方法的正确方法。不确定为什么你想要从Activity完成AsyncTask而不是

答案 1 :(得分:16)

你可以尝试做什么而不是调用context.finish(),为什么不做这样的回调接口:

public interface TaskCallback{
void done();
}

然后将其实施到您的活动

public Hello extends Activity implements TaskCallback{

    .....BUNCH OF ACTIVITY CODE.....

public void onCreate(Bundle savedInstanceState) {

    MyTask mt = new MyTask(this);
    mt.execute();
}

public void done() {
     finish();
}

}

而不是将Context作为参数,而是使用TaskCallback

public class MyTask extends AsyncTask<Void, Void, Void> {
private TaskCallback mCallback;

public MyTask(TaskCallback callback) {

    mCallback = callback;
}  

//doinbackground, etc

    protected void onPostExecute() {
    mCallback.done();

}

你去了,它为你提供了更多的灵活性来定制每个实现。

答案 2 :(得分:3)

我遇到了同样的情况,然后我做了如下:

public class MyTask extends AsyncTask<Void, Void, Void> {
private Activity mActivity;
private Context mContext;

public MyTask(Activity activity) {
    mActivity = activity;
    mContext = mActivity.getApplicationContext();
}  

//doinbackground, etc

protected void onPostExecute() {
    mActivity.finish();

}

希望有所帮助:)

答案 3 :(得分:2)

在您的活动类中定义一个方法,如下所示:

public void FinishAfterAsyncTask()
{
   this.finish();
}

并从OnPostExecute类的AsynTask方法调用此方法。

答案 4 :(得分:1)

您可以创建一个从公共扩展的新的私有AsyncTask。

在这个私有的AsyncTask中,你可以访问Activity的东西,你可以覆盖onPostExecute方法来完成它。

您真正的AsyncTask

public class MyPublicAsyncTask extends AsyncTask<Void, Void, Void> {
    Context context;
    public GetHorariosAsyncTask(Context ctx){
        context = ctx;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // prepare yourself for an async work
    }
    @Override
    protected Void doInBackground(Void... params) {
        // Do yout cool async stuff
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
       // you're finish, let's tell to user
    }
}

您使用私有AsyncTask的活动

public class MyActivity  extends Activity {
    Activity mAct;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mAct = this;
    }

    private class MyPrivateAsyncTask extends MyPublicAsyncTask {

        public MyPrivateAsyncTask(Context ctx) {
            super(ctx);
            // TODO Auto-generated constructor stub
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            // our async task is completed! let's take care of this activity
            mAct.finish();
        }

    }
}

答案 5 :(得分:-4)

你能试试吗

this.finish()

似乎是因为使用mContext调用它,它表示未定义。