2011-07-18 3 views
2

그 코드가 내 문제를 설명하는 데 도움이됩니다 다른 스레드의 실행에 대해보다 Runnable의 :대기열 안드로이드

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를 점검하고 (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