0

我在处理 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,因为我还有其他一些问题,这就是我选择 Thread 的原因,即使现在问题是 Thread 等待,请对此提出建议

4

4 回答 4

1

-使用java.util.CountDownLatch, 在这里你可以让一些过程在启动其他代码之前完成。

- countDown()并且await()会对你有用.......

看这个 CountDownLatch 的例子:

http://www.javamex.com/tutorials/threads/CountDownLatch.shtml

于 2012-11-30T07:02:02.943 回答
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();
于 2012-11-30T07:09:56.567 回答
0

如果您冻结主 UI 线程,您期望会发生什么?

您应该使用 ASyncTask 在 onPreExecute 方法中显示您的 gui,在 doInBackground 中执行任务,然后在 onPostExecute 方法中显示结果。

另外,您也可以使用 onProgressUpdate 更新进度。

于 2012-11-30T07:10:52.993 回答
0

这不是一个解决方案,只是关于如何构建活动/应用程序的建议。

您永远不应该通过调用wait()其糟糕的用户体验来阻止主线程并且不建议这样做。它还会出现 Android 无响应 (ANR) 弹出窗口。

您可以让您从后台线程更新 UI 并让 UI 响应。加载 UI 的静态部分,onCreate()然后启动后台线程以延迟加载组件的其余部分。

于 2012-11-30T07:40:43.927 回答