我已经读过android中的主要UI线程不应该调用sleep。
但是,我的申请需要:
使用2线程的输出(2张图像),添加它们然后显示它们。
我正在使用Thread.sleep(),以便主线程等待thread1和thread2直到它们完成。但是,我在主线程(睡眠后)调用它后,mImageview.setbitmap无效。
你能告诉我应该怎么做吗?
答案 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。这是如何
ExecutorService.awaitTermination()
;为主线程等待Runnable任务完成。其文档为阻止所有任务在关闭后完成执行 请求,或发生超时,或当前线程被中断, 以先到者为准。
这是Asynch的做法,我猜应该是首选。