【问题标题】:Using AsyncTask to start activity使用 AsyncTask 启动活动
【发布时间】:2012-05-24 11:55:43
【问题描述】:

我正在使用 asyncTask 显示对话框,然后在几分钟后启动一个新活动。

不幸的是,活动在任务完成之前开始???

package com.android.grad;

import android.app.Activity;

import android.app.ProgressDialog;

import android.os.AsyncTask;

import android.widget.Toast;

public class LoginTask extends AsyncTask<Void, Void, Boolean> {
private Activity activity;
private ProgressDialog pd;

public LoginTask(Activity activity) {
    this.activity = activity;
}

@Override
protected void onPreExecute() {
    pd = ProgressDialog.show(activity, "Signing in",
            "Please wait while we are signing you in..");
}

@Override
protected Boolean doInBackground(Void... arg0) {
    try {
        Thread.sleep(10000000);
    } catch (InterruptedException e) {
    }
    pd.dismiss();
    return true;
}

@Override
protected void onPostExecute(Boolean result) {
    Toast.makeText(activity, Boolean.toString(result), Toast.LENGTH_LONG).show();
}

}

我从按钮单击侦听器执行任务:S

private OnClickListener loginOnClick = new OnClickListener() {

        public void onClick(View v) {
            new LoginTask(LoginActivity.this).execute();
            startActivity(new Intent(LoginActivity.this, BuiltInCamera.class));
        }
    };

有没有办法从我的子类 ofAsyncTask 开始活动。

【问题讨论】:

  • 是的,你应该在你的 onPostExecute 方法中启动它,就在你展示你的 Toast 之后
  • 方法不能在onPostExecute里面调用
  • 提高你的接受率..

标签: android android-asynctask


【解决方案1】:

是的,您可以从 AsyncTask 的子类开始活动。见下文:

@Override
protected void onPostExecute(Boolean result) {
    Toast.makeText(activity, Boolean.toString(result), Toast.LENGTH_LONG).show();

    activity.startActivity(new Intent(activity, BuiltInCamera.class));
}

进行此更改后,请确保从 OnClickListener

中删除 startActivity

【讨论】:

  • 活动是怎么来的? (新意图(活动,...)
  • activity 是对您的 Activity 的引用,即通过 AsyncTask 的构造函数接收。
  • 如果activity被破坏了呢?
  • 然后它会崩溃。为了安全起见,请在使用其参考之前检查activity != null
【解决方案2】:

在显示 toast 消息后,从 onPostExecute() 调用此 startActivity(new Intent(LoginActivity.this, BuiltInCamera.class));

这样,在你的AsyncTask结束后,新的activity就会被调用。

【讨论】:

    【解决方案3】:

    你也可以使用

        Intent intent = new Intent(activity, PageViewActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        activity.getApplicationContext().startActivity(intent);
    

    【讨论】:

    • 它工作正常,但在我的尝试中,该活动运行了两个时间 - 一个在新活动中(第一行 - 第二个在第三行
    【解决方案4】:

    onPostExecuteAsyncTask 方法内调用startActivity

    【讨论】:

    • 方法没找到:S 我越来越尝试了
    • 你应该使用 YourClassActivityName.this.startActivity。然后它会工作
    猜你喜欢
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2013-01-28
    相关资源
    最近更新 更多