UI线程等待其他线程执行 - 不工作

时间:2012-04-10 10:45:43

标签: java android multithreading imageview

我已经读过android中的主要UI线程不应该调用sleep。

但是,我的申请需要:

  1. 从主UI线程调用thread1
  2. 从主UI线程调用thread2。
  3. 使用2线程的输出(2张图像),添加它们然后显示它们。

    我正在使用Thread.sleep(),以便主线程等待thread1和thread2直到它们完成。但是,我在主线程(睡眠后)调用它后,mImageview.setbitmap无效。

    你能告诉我应该怎么做吗?

4 个答案:

答案 0 :(得分:1)

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

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

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

尽管没有反应的GUI总是让人觉得你的应用程序会出现问题,但如果UI-Thread被阻止超过5秒(这是一个很长的时间),你的应用程序将被强制关闭,因为它没有“反应”(并且会引发ANR)。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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();

答案 3 :(得分:0)

我建议使用ExecutorService。这是如何

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

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

    这是Asynch的做法,我猜应该是首选。