2011-07-18 34 views
2

该代码会帮我解释一下我的问题:队列可运行在其他线程运行的Android

public class TestHandlerActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    new Thread(){ 
     public void run(){ 
      for (int i=0;i<20;i++){ 
       handler.post(run); 
      } 
     } 
    }.start(); 
} 

Handler handler=new Handler(){ 

}; 

Runnable run = new Runnable(){ 
    public void run(){ 
     try { 
      Thread.sleep(1500); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Log.d("TAG", "Message processed"); 
    } 
}; 
} 

这样新的线程,使它们由处理在主线程服务的申请。 我需要做的恰恰相反。 UI线程启动请求,这些请求由另一个线程按顺序提供(顺序很重要),并且在每个请求结束时不需要通知UI线程。 一些要点对此很重要:请愿书有3个参数(int,int,boolean),他们在数据库中进行更改,并且由用户与UI的交互生成,因此不会同时启动 推进

+0

查看工作线程拉出队列。您可以使用其中一个并发队列,例如ConcurrentLinkedQueue。 – Steven

+0

感谢您的快速解答Steven,我是多线程的入门者。我检查了ConcurrentLinkedQueue,看起来像一个执行while(true){if(queue.pool()!= null)/ *的线程,因此pool * /}有效,但不是CPU最优。你能解释我怎样才能改善这一点?谢谢! – Jaimit

回答

2

一种选择是使用,让你的主题:http://developer.android.com/reference/android/os/HandlerThread.html

这将创建自己的消息队列和循环线程。您可以创建一个处理程序,这样运行的线程上的工作:

HandlerThread handlerThread = new HandlerThread("My Handler"); 
handlerThread.start(); 
Handle myHandler = new Handler(handlerThread.getLooper()); 

这确实需要通过线程完成的所有工作将通过处理程序就可以发送消息和调度的Runnable这样做。

+0

听起来不错,谢谢你的答案。我需要那个处理程序,而我的应用程序是在前台,我应该调用handlerThread.quit()当它去背景?或不是必需的? – Jaimit

+0

如果你愿意,你可以退出它。然而,很多时候,没有理由不让它坐在那里,以便下次用户返回到应用程序时继续使用它。 – hackbod

相关问题