在Thread中调用AsyncTask

时间:2012-10-03 09:29:15

标签: android

我在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();

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

这是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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

当上下文从MainActivity更改为线程类时,您无法直接在线程内使用 this 。所以你需要做以下事情,

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

你可以从一个线程中运行AsyncTask,没有关于那个的硬性规则。

答案 2 :(得分:1)

使用

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

答案 3 :(得分:1)

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