0

I have read that the main UI thread in android should not call sleep.

However, my application needs to :

  1. call thread1 from main UI thread
  2. call thread2 from main UI thread.

Use the output (2 images) of the 2 thread, add them and then display them.

I am using Thread.sleep() so that the main thread waits thread1 and thread2 till they are done. However mImageview.setbitmap is not working after i call it in the main thread (after sleep).

can u pls advise me how i should do this?

4

4 回答 4

1

Android中的多线程应该异步完成。为此,您应该使用AsyncTask-class

对于您的情况,例如,您将创建一个任务来加载(或处理)这两个图像。当进程正在运行时(在另一个线程中,在 UI 线程之外),您可以ProgressBar向用户显示您的应用程序当前很忙(然后在 UI 线程上完成)。

任务完成后,您会从任务中获取结果(您的两张图像),隐藏进度条并向用户显示所有内容。

尽管一个无反应的 GUI 总是有你的应用程序冻结的感觉,如果一个 UI 线程被阻塞超过 5 秒(这是一个很长的时间),你的应用程序将被强制关闭,因为它不是"反应”(并且会引发ANR )。

于 2012-04-10T10:51:45.963 回答
0

我建议使用ExecutorService。这是如何

  1. 将两个图像加载活动创建为 Runnable 任务。
  2. 使用 ExecutorService 执行它们。
  3. 使用ExecutorService.awaitTermination();让主线程等待 Runnable 任务完成。它的文档显示

在关闭请求后阻塞,直到所有任务都完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。

这是异步的方式,我想应该是首选。

于 2012-04-10T13:24:51.320 回答
0

这不仅仅是 Thread.Sleep()。在 GUI 线程中,执行所需的任何操作来启动两个线程/任务/任何操作,然后退出事件处理程序。

不要在 GUI 事件处理程序中等待!不在 Java、C++、C、Delphi 中。使用异步任务或处理程序,并向 GUI 线程发出信号。线程 1 表示已完成,线程 2 表示已完成。在任何一种情况下,检查数据是否已被另一个线程返回。如果有,则您拥有两组返回的数据,因此您可以添加它们并显示它们。

不要在 GUI 事件处理程序中等待。

于 2012-04-10T10:59:32.013 回答
0

为此,您可以简单地使用线程和处理程序。这是一个小演示,

像这样在你的 onCreate 中创建一个处理程序,

Drawable d=null;    

Handler handler=new Handler()
{

public void handleMesaage(Message msg)
{
   if(msg.what==0)
{
   imageView.setBackgroundDrawable(d);
}

}

};

现在像这样调用你的线程,

Thread t=new Thread(new Runnable()
{
@Override
public void run() {
   InputStream is = (InputStream) new URL(url).getContent();
   d = Drawable.createFromStream(is, "src name");
    handler.sendEmptyMessage(0);
}
});t.start();
于 2012-04-10T11:51:38.480 回答