0

所以我有以下线程:

  public class MyThread extends Thread
{
  Handler cHandler;
 private boolean looprunning = false;
  MyThread() {
  cHandler = new Handler();
          looprunning = true;

  }

  @Override
  public void run(){
      while (looprunning) {
          //do stuff here
        //update another system here or something else.
      }
  }

}

在该线程的 while 循环内,我想运行一个 Runnable,当线程在该 while 循环内循环时,我将其传递给线程。我该怎么做呢?

4

3 回答 3

2

首先请标记looprunning为 volatile 以获得正确的线程可见性

你可以使用队列

Queue<Runnable> taskQueue = new ConcurrentLinkedQueue<Runnable>();
@Override
public void run(){
   while (looprunning) {
       //do stuff here
     //update another system here or something else.
     Runnable r = taskQueue.poll();
     if(r!=null)r.run();
   }
} 

您可以使用您选择的(线程安全)队列

于 2012-05-16T12:44:04.973 回答
1

Android 已经提供了一种机制来创建在执行 Runnables 的循环中运行的线程。看看HandlerThread

于 2012-05-16T12:44:32.170 回答
1

无论您在该运行方法中编写了什么计算,当它完成后向处理程序发送消息以及任何与 UI 相关的事情(例如更改 UI),您都可以这样做,就像我在做 progressdialog dismiss(); 还有一件事,如果尝试在运行中更改 UI 之类的东西,你肯定会得到泄漏窗口错误,因为你试图在非 UI 线程中更改 UI。

final Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {


            dialog.dismiss();

        }

    };



            dialog = ProgressDialog.show(NewTransaction.this, "",
                    "Loading Meters...", false);

            new Thread() {

                public void run() {

                    while(Condition){

                                  do Something
                                 }
                    handler.sendEmptyMessage(0);

                }

            }.start();
于 2012-05-16T13:10:44.963 回答