0

프로그램 흐름 중에 처리기를 사용하여 TextView를 업데이트하는 방법을 이해하지 못합니다. 나는이처리기 및 TextView 업데이트 문제

public class MainActivity extends AppCompatActivity { 

TextView text; 
boolean isReady; //boolean to check a new Message 
String update; //String to send to TextView 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    text = (TextView) findViewById(R.id.textView); 
    Handler handler = new MyHandler();   //defined down 
    MyHandlerThread thr = new MyHandlerThread(handler); //defined in other .class file 
    thr.start(); 
    for(int i=0;i<100;i++){ //a simple for 
     if(i%2==0) 
      thr.setMessage(i + ": Divisible for 2"); 
     else 
      thr.setMessage(i+": Not Divisible for 2"); 
    } 

} 


private class MyHandler extends Handler { //inner class 
    @Override 
    public void handleMessage(Message msg) { 
     Bundle bundle = msg.getData(); 
     if(bundle.containsKey("refresh")) { 
      String value = bundle.getString("refresh"); 
      text.setText(value); 
     } 
    } 
}} 

같은 간단한 코드에서 테스트하고 있는데 이것은이 코드는 바로 마지막 예상되는 문자열을 인쇄

public class MyHandlerThread extends Thread { 
private Handler handler; 
private boolean isSent; 
String text; 
public MyHandlerThread(Handler handler) { 
    this.handler = handler; 
    isSent=false; 
    text=""; 
} 
public void run() { 
    try { 
     while(true) { 
      if(isSent){ 
       notifyMessage(text); 
       Thread.sleep(1000); 
       isSent=false; 
      } 
     } 
    }catch(InterruptedException ex) {} 
} 

public void setMessage(String str){ 
    text=str; 
    isSent=true; 
} 

private void notifyMessage(String str) { 
    Message msg = handler.obtainMessage(); 
    Bundle b = new Bundle(); 
    b.putString("refresh", ""+str); 
    msg.setData(b); 
    handler.sendMessage(msg); 
}} 

스레드 코드 "99 :하지 2 divible"

답변

1

방금 ​​스레드 100 번을 setMessage이라고 부르기 때문에 스레드 루프가 인쇄하기 전에 텍스트가 서로 겹쳐 쓰여집니다.

setMessage에 대기열을 구현 한 다음 스레드 루프가 대기열의 다음 요소를 팝업하고 인쇄 (Handler을 통해 메시지 보내기) 한 다음 절전 모드로 전환해야합니다. 더 이상 요소가 큐에 없으면 하나가 사용 가능해질 때까지 반복하십시오.

+0

실용 사례를 만들 수 있습니까? 나는 당신의 솔루션을 시도하고 있지만 작동하지 않는 것 같다. –