在一个线程中调用AsyncTask

4

我正在开发一款Android应用程序,想要从UI主线程中调用AsyncTask。为此,我需要从一个线程中调用AsyncTask。

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

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

CommonAsync是我的AsyncTask类。我想从下面的方法中的线程调用它时,将我的活动和一个整数参数传递给AsyncTask构造函数。该怎么做呢?

CommonAsync是我的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;
    }
}

我们该怎样解决这个问题。谢谢。

我注意到的第一件事是你在doInBackground()中启动活动..为什么不在onPostExecute()中进行呢?同时,你在启动线程后又在一个线程中调用asycTask..你真的需要重新考虑你正在做的事情! - ColdFire
请查看我的问题A.A. 我正在尝试从另一个线程启动我的AsynkTask。当我们从UI主线程启动AsynkTask时会出现问题。请参考此链接以获取更多详细信息https://dev59.com/-mw15IYBdhLWcg3w3vpe 我认为我们必须在AsynkTask的doInBackground()函数中执行所有功能。即使我在onPostExecute()中调用我的Intent,我该如何解决我的问题。 - Arun PS
4个回答

3

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

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


嗨 Philio, 感谢您的回复。当我们在UI主线程中运行AsyncTask时会出现一些问题。错误是android.os.NetworkOnMainThreadException。请查看以下链接以获得更多信息。https://dev59.com/-mw15IYBdhLWcg3w3vpe - Arun PS
我想要澄清的是,你可以直接在UI线程中实例化和运行AsyncTask,例如new SomeAsyncTask().run(),而不是在一个线程中运行它。 - Philio

2

当你在一个线程内部使用this时,上下文会从你的MainActivity更改为线程类,因此不能直接使用。所以你需要执行以下操作:

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

你可以在线程中运行AsyncTask,没有硬性规定。


嗨,Royston,感谢你的回复。构造函数CommonAysnk(Class <SplashScreen>,int)未定义。我仍然得到这个错误。请解决这个问题。 - Arun PS
好的,我明白了,改成CommonAysnk。mobjCommonAysnk = new CommonAysnk(); - Royston Pinto
那我怎样可以将参数值传递给CommonAysnk类的构造函数呢? - Arun PS
你可以删除“this”,因为你不需要传递上下文,只需传递数字“1”。 - Royston Pinto
请查看我的问题。我已经更新了我的CommonAysnk类。 - Arun PS
首先,您不需要将Activity传递给AsyncTask,只需传递Integer即可。其次,您不需要构造函数,可以访问传递的参数,请搜索相关内容。第三,在switch case中,不要返回null,而是返回有效的字符串。您可以在onPostExecute()中使用此字符串来启动Intent。由于onPostExecute()在UI线程上运行,因此您可以在那里使用"this"而无需上下文。希望这可以帮助您! - Royston Pinto

1

使用

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

你好, 构造函数CommonAysnk(Class<SplashScreen>, int)未定义。我仍然遇到这个错误。 - Arun PS
你是如何定义构造函数的? - ColdFire
请查看我的问题。我已经更新了我的CommonAysnk类。 - Arun PS

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接