我在android中处理线程有一个问题,在我的类中我必须创建一个线程,在该线程完成后创建一些UI我会获得一些值,这里我想等待我的主进程,直到线程完成它进程但是当我在主进程线程中放置wait()或notify时,我的应用程序中没有显示UI
这是示例代码
protected void onCreate(Bundle savedInstanceState) {
downloadThread = new MyThread(this);
downloadThread.start();
synchronized(this){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String test=Recognition.gettemp();
public class MyThread extends Thread {
private Recognition recognition;
public MyThread(Recognition recognition) {
this.recognition = recognition;
// TODO Auto-generated constructor stub
}
@Override
public void run() {
synchronized(this)
{
handler.post(new MyRunnable());
}
notifyAll();
}
}
}
static public class MyRunnable implements Runnable {
public void run() {
settemp(template);
}
}
}
public static String gettemp() {
return template;
}
public static void settemp(String template) {
Recognition.template = template;
}
}
这里我不会使用AsynTask,因为我有一些其他问题是我选择线程的原因即使现在问题是线程等待做任何给出的建议
答案 0 :(得分:1)
- 使用java.util.CountDownLatch
,您可以在此处启动某些流程,然后再启动其他代码。
- countDown()
和await()
会对您有用.......
请参阅CountDownLatch的此示例:
http://www.javamex.com/tutorials/threads/CountDownLatch.shtml
答案 1 :(得分:0)
使用以下逻辑: -
new Thread(new Runnable()
{
@Override
public void run()
{
//do the code here such as sending request to server
runOnUiThread(new Runnable()
{
@Override
public void run()
{
//do here the code which interact with UI
}
});
}
}).start();
答案 2 :(得分:0)
如果你冻结主UI线程,你会发生什么?
您应该使用ASyncTask在onPreExecute方法中显示您的gui,在doInBackground中执行该任务,然后在onPostExecute方法中显示结果。
作为加分,您也可以使用onProgressUpdate更新进度。
答案 3 :(得分:0)
这不仅仅是一个关于如何构建活动/ app的建议的解决方案。
你永远不应该通过调用wait()
来阻止主线程,这是一种糟糕的用户体验而不是建议。它也会出现Android Not Responding(ANR)弹出窗口。
您可以让您从后台线程更新UI并让UI响应。在onCreate()
中加载UI的静态部分,然后将后台线程启动到组件的延迟加载其余部分。