如何从一个单独的线程正确调用AsyncTask?

时间:2011-06-09 06:44:53

标签: android multithreading download android-asynctask looper

我正在开发一个在单独的线程中运行的游戏。现在我需要从Internet下载图像。我为此编写了一个AsyncTask类,但我无法弄清楚如何从我的游戏线程中正确调用它?事实上,我的AsyncTask正在阻止,但我需要在下载图像之前等待。如果我使用runOnUIThread,它不会阻止我的线程并且更进一步,这根本不适合我。我在尝试运行Looper.prepare()之前也试过使用AsyncTask,但这也有一些麻烦:Looper.myLooper().quit()似乎没有用,如果我试图调用AsyncTask再一次,我得到一个例外,告诉我我第二次打电话给Looper.prepare()。 我该怎么办?提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果您的游戏线程不是您的主线程,如果它不是UI线程,则从您的游戏线程调用处理程序。现在从这个处理程序调用你的异步任务。

只需调用类似的东西。

hm.sendEmptyMessage(0);

Handler hm = new Handler(){


public void handleMessage(Message msg)
{
//call async task.
}

};

感谢。

答案 1 :(得分:1)

如果您的后台线程无论如何都会阻塞,您不需要AsyncTask并且可以直接在此线程中进行图像加载。要在UI线程上发布,您需要设置Handler设置looper。一种选择是传递在UI线程中创建的处理程序。其他选项是将一些上下文传递给后台线程并执行

Handler h = new Handler(context.getMainLooper());

如果在图像加载过程中需要一些进度更新,可以使用AsyncTask并使用按照描述创建的处理程序。