【问题标题】:start another activity from an AsyncTask从 AsyncTask 开始另一个活动
【发布时间】:2014-08-15 12:43:41
【问题描述】:

我想知道在完成一个任务后如何启动一个Activity,详细:

在我的课堂上我有一个AsyncTask,完成我的任务后,我想打电话给activity2

   private class AccessTokenGet extends AsyncTask<String, String, Boolean> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected Boolean doInBackground(String... args) {

            return true;
        }

        @Override
        protected void onPostExecute(Boolean response) {
            if (response) {
            //call activity2
        }
    }

【问题讨论】:

  • 如果AsyncTask是一个内部类,那么在启动Activity2的Fragment中调用Activity回调方法:codereview.stackexchange.com/questions/57543/…
  • @Zhuinden 好的,非常感谢,我明白了。如果我有一个不是片段或其他东西的类,我在其上扩展 AsyncTask ,我如何从 onPostExecute 方法开始另一个 activity ?
  • AsyncTask onPostExecute() 调用 activity.goToNextActivity(); 这是一个回调函数,您必须像我链接的示例中那样自己实现,创建一个意图 Intent intent = new Intent(this, NextActivity.class); 并启动活动 startActivity(intent);。

标签: android android-activity android-fragments


【解决方案1】:

如果你的班级是内部的

   public class StackQuestion extends Activity {

        @Override
        protected void onCreate( final Bundle savedInstanceState ) {
            super.onCreate( savedInstanceState );

            final MyAsyn mMyAsyn = new MyAsyn( this );
            mMyAsyn.execute();
        }

        public class MyAsyn extends AsyncTask<Void, Void, Void> {

            @Override
            protected Void doInBackground( final Void ... params ) {
                return null;
            }

            @Override
            protected void onPostExecute( final Void result ) {
                super.onPostExecute( result );

                startActivity( new Intent( "your intent here" ) );
            }
        }
    }

如果它在一个单独的文件中

public class StackQuestion extends Activity {

    @Override
    protected void onCreate( final Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );

        final MyAsyn mMyAsyn = new MyAsyn( this );
        mMyAsyn.execute();
    }
}

public class MyAsyn extends AsyncTask<Void, Void, Void> {

    private final Activity mActivity;

    public MyAsyn( final Activity mActivity ) {
        this.mActivity = mActivity;
    }

    @Override
    protected Void doInBackground( final Void ... params ) {
        return null;
    }

    @Override
    protected void onPostExecute( final Void result ) {
        super.onPostExecute( result );

        this.mActivity.startActivity( new Intent( "your intent here" ) );
    }
}

已编辑:

public class Activity1 extends Activity {

    @Override
    protected void onCreate( final Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );

        final AccessTokenGet mAccessTokenGet = new AccessTokenGet( this );
        mAccessTokenGet.execute();
    }
}

public class Activity2 extends Activity {

    @Override
    protected void onCreate( final Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );

        //Your code here
    }
}

public class AccessTokenGet extends AsyncTask<String, String, Boolean> {

    private final Activity mActivity;

    public AccessTokenGet( final Activity mActivity ) {
        this.mActivity = mActivity;
    }

    @Override
    protected Boolean doInBackground( final String ... args ) {

        return true;
    }

    @Override
    protected void onPostExecute( final Boolean response ) {

        if ( response ) {
            this.mActivity.startActivity( new Intent( this.mActivity.getBaseContext(), Activity2.class ) );
        }
    }

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

【讨论】:

  • 我从activity1启动aSyncTask,我想在完成后第一次启动activity2。
  • @oIrC,我编辑了我的答案,试图更清楚地解决我认为这里存在的问题。
  • woooo.... 不喜欢指向当前活动 (mActivity) 的指针。内存泄漏...
  • @G.BlakeMeike,作为项目架构级别的组织问题,在使用 AsyncTask 时,它们始终位于不同的包中,并使用回调与项目的其他部分进行通信。对于像这样的简单情况,简单检查 Activity 的引用是否仍然有效就足够了。
  • 不确定这意味着什么……但只要 AT 持有对它的引用,就无法对 Activity 进行 GC。
【解决方案2】:
@Override 
protected void onPostExecute(Boolean response) {
    if (response) {
        progress.hide(); 

        final Intent intent = new Intent(this, Activity2.class);
        activity1.startActivity(intent);

    } 
} 

这里唯一的问题是您从哪里获得对 activity1 的引用 - 这里有一些选项取决于您的项目 - 例如您可以将其传递给构造函数中的异步任务。

PS:小心这个未经检查的progress.hide(); - 当有人在此之前将您的 Activity 发送到后台(例如通过按 home 键)时,这可能会崩溃

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多