4

我在一个 android 应用程序中工作,我想从我的 UI 主线程调用一个 AsyncTask。为此,我想从线程中调用我的 AsyncTask。

这是我从主 UI 线程调用的方法。这工作正常

  CommonAysnk   mobjCommonAysnk = new CommonAysnk(this, 1);
  mobjCommonAysnk.execute();

CommonAysnk 是我的 AsyncTask 类。我想将我的活动和一个整数参数传递给 AsyncTask 构造函数。如何从线程中调用它,如下所示的方法。

 Thread t = new Thread() {
                public void run() {
                    try {                       
            CommonAysnk   mobjCommonAysnk = new CommonAysnk(this, 1);
            mobjCommonAysnk.execute();
                    } catch (Exception ex) {

                    }}};                            
            t.start();

当我尝试从线程调用它时,我无法正确传递活动参数。

这是 CommonAysnk 类。请调查一下

public class CommonAysnk extends AsyncTask<URL, Integer, String> {

    private Common mobjCommon = null;
    private Activity mobjActivity = null;
    private int mcallIntentcond = 0;
    private ProgressDialog mProcessDialog = null;

    public CommonAysnk(Activity activity, int condition) {
        mobjActivity = activity;
        mcallIntentcond = condition;

    }
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        mProcessDialog.dismiss();
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mobjCommon = new Common();
        mProcessDialog = mobjCommon.showProgressDialog(mobjActivity, "",
                "Loading...", false);
    }
    @Override
    protected String doInBackground(URL... params) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {

        }
        switch (mcallIntentcond) {
        case 1:
            Intent i=new Intent(mobjActivity, Home.class);
            mobjActivity.startActivity(i);
            mobjActivity.finish();
            break;
        }

        return null;
    }
}

我们怎么能做到这一点。谢谢

4

4 回答 4

3

没有理由在这样的线程中运行 AsyncTask,您可以在 UI 线程上调用它。AsyncTask 为您管理线程。

您在 doInBackground 方法中输入的代码会自动在后台线程中运行,您的 AsyncTask 上的其他方法在 UI 线程上运行,您可以直接与 UI 进行安全交互。

于 2012-10-03T09:33:29.477 回答
2

当上下文从 MainActivity 更改为线程类时,您不能直接从线程内部使用它。因此,您需要执行以下操作,

CommonAysnk   mobjCommonAysnk = new CommonAysnk(ActivityName.this, 1); 

您可以从一个线程中运行 AsyncTask,对此没有硬性规定。

于 2012-10-03T09:36:23.377 回答
1

利用

 CommonAysnk mobjCommonAysnk = new CommonAysnk(ClassName.this, 1);
 mobjCommonAysnk.execute();
于 2012-10-03T09:31:30.337 回答
1

必须asynctask仅从主线程调用,否则当我们尝试从onPreExecuteoronProgressUpdateonPostExecute函数触摸 UI 时,它可能会在运行时崩溃。

于 2017-06-28T15:11:46.840 回答