2013-08-01 3 views
0

웹을 조사하여 확실한 예제를 찾았지만 지금까지 프로젝트에 적용 할 수있는 것을 찾지 못했습니다.처리기를 사용하여 UI 스레드 업데이트

저는 100ms마다 실행되는 작업자 스레드를 만들려고합니다. 그런 다음 UI를 결과로 업데이트해야합니다. 몇 가지 조사를 한 후에 UI 업데이트를 관리하기 위해 Handlers를 사용해야한다고 결정했습니다.

내 활동의 처리기 : 나는이 프로그램을 실행하면

public class ManagerUdpReceiver 
{ 
    private int minPort = 1234; 
    private int maxPort = 1240; 
    private ArrayList<PortListener> portList; 
    private Handler handler; 
    private Thread portThread; 
    private int queryInterval = 100; 
    private boolean stop = false; 


    public ManagerUdpReceiver(int minport, int maxport, Handler handler, int queryInterval) 
    { 
     minPort = minport; 
     maxPort = maxport; 
     this.handler = handler; 
     this.queryInterval = queryInterval; 

     //create port listeners from given range and start their threads 


    start(); 
} 

private void start() 
{ 
    stop = false; 
    // Create Inner Thread Class 
    portThread = new Thread(new Runnable() 
    { 
     // After call for background.start this run method call 
     public void run() 
     { 

      if (portList == null) 
      { 
       portList = new ArrayList<PortListener>(); 
       for (int i = minPort; i < maxPort; i++) 
       { 
        portList.add(new PortListener(i)); 
       } 
      } 

      if (!stop) 
      { 
       ManagerUdpPacket p = portList.get(0).receive(); 
       threadMsg("moi", p); 
       //mHandler.postDelayed(this, queryInterval); 

      } 
      else 
      { 
       //stop execution and close ports 
       for (int i = 0; i < portList.size(); i++) 
       { 
        portList.get(i).close(); 
       } 
      } 


     } 

     //send message to the handler 
     private void threadMsg(String msg, ManagerUdpPacket p) 
     { 
      if (!msg.equals(null) && !msg.equals("")) 
      { 
       Message msgObj = handler.obtainMessage(); 
       //msgObj.obj = p; 
       Bundle b = new Bundle(); 
       b.putString("message", msg); 
       msgObj.setData(b); 
       handler.sendMessage(msgObj); 
      }    
     } 
    }); 

    // Start Thread 
    portThread.start(); 
} 



public void close() 
    { 
     stop = true; 
    } 
} 

내가 네트워킹 코드를 실행에 대한 예외를 얻을 : 작업자 스레드를 가지고

private final Handler handler = new Handler() { 

     public void handleMessage(Message msg) { 

     String aResponse = msg.getData().getString("message"); 

     if ((null != aResponse)) { 

      // ALERT MESSAGE 
      Log.v("udppacket", "UDP message!"); 
      if (msg.obj != null) 
      { 
       ManagerUdpPacket p = (ManagerUdpPacket) msg.obj; 
       operatorListFragment.updateContent((int) p.getOperationTime()); 
      } 
     } 
     else 
     { 

     }  

    } 
}; 

내 다른 클래스 I이 솔루션에 온 UI 스레드에서. 이제 작업자 스레드는 UDP 패킷을 받아 처리해야합니다. 그러나 그 코드는 portThread 스레드 안에 있습니다! 나는 그 handler.postDelayed (this, queryInterval); 나는 매 100ms마다 스레드를 루프 처리하는 데 사용하여 어떻게 든 다음 작업주기가 내 작업자 스레드 대신 UI 스레드에서 실행되게합니다.

내 질문은 내가 여기서 잘못하고 어떻게 해결할 수 있습니까? 아니면 100ms마다 루핑 작업을 올바르게 수행하는 방법은 무엇입니까? 또한 Activity 내부와 worker-thread 내부의 예제를 보았 기 때문에 Handler를 어디에 둘지 확실치 않습니다.

+0

이 부분을 살펴볼 수 있습니다. http://stackoverflow.com/questions/6223389/do-some-android-ui-stuff-in-non-ui-thread?lq=1 또한 배경 스레드에서 루프에서 코드를 실행할 수 있습니다 – sej101

답변

1

좋아, 나는 그것이 만족스럽지 않아서 작동하지 않을 것이라고 생각한다.

기본적으로 나는 TimerTask를 사용하여 매 100ms마다 코드를 실행하고 Handler를 통해 UI 스레드에 알리는 작업을 마쳤습니다.

dataStreamTimer = new Timer(); 
    dataStreamTask = new TimerTask() 
    { 
     public void run() 
     { 

      if (portList == null) 
      { 
       portList = new ArrayList<PortListener>(); 
       for (int i = minPort; i < maxPort; i++) 
       { 
        portList.add(new PortListener(i)); 
       } 
      } 

      if (!stop) 
      { 

       ManagerUdpPacket p = portList.get(0).receive(); 
       threadMsg("moi", p); 
       //handler.postDelayed(this, queryInterval); 

       //stop thread until next query 
       try { 
        synchronized(this){ 
         this.wait(queryInterval); 
        } 
       } catch (InterruptedException e) { 
        Log.e("ERR", "InterruptedException in TimerTask.run"); 
       } 
      } 
      else 
      { 
       //execution has been stopped, clear data: 
       //stop execution and close ports 
       for (int i = 0; i < portList.size(); i++) 
       { 
        portList.get(i).close(); 
       } 
      } 

     } 
+0

을 매 사이클 후 100ms 동안 수면. – snapix

0

정말 핸들러의 목적을 이해 해달라고 :이 최선의 선택은 (내가 타이머가 크지 않은 것을 들었습니다)하지만 작동하는 것 같다 경우 난 정말 모르겠어요. backround 스레드에서 데이터를 준비하지 않고 myActivity.runOnUIThread()을 사용하여 updateContent() 메소드를 실행하는 이유는 무엇입니까? p.getOperationTime()이 네트워크 작업으로 간주 될 수 있으므로이 값을 백그라운드 스레드의 일부 변수에 저장하고 UI 스레드로 게시하려고 시도하십시오.