How to set text of text view in another thread

匿名 (未验证) 提交于 2019-12-03 02:13:02

问题:

I am tring to setText in another thread, that is, child thread. But for the following code, it is giving the error

Only the original thread that created a view hierarchy can touch its views.

 

 

public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     img = (ImageView)findViewById(R.id.img);     pb = (ProgressBar)findViewById(R.id.pb);     this.tv = (TextView)findViewById(R.id.perc);     tv.setText("30 %");     pb.setProgress(30);     pb.setMax(100); }  public void set(int p) {     tv.setText(p + " %"); }  protected void onStart() {     super.onStart();     pb.setProgress(20);      Thread t = new Thread(new Runnable()     {         @Override         public void run()         {             try {                 int i = pb.getProgress();                 while(i <100)                 {                     while(pb.getProgress()<100)                     {                         pb.incrementProgressBy(5);                         Thread.sleep(1000);                     }                 i+=10;                 pb.setProgress(i);                 Thread.interrupted();                 set(i);                 }             }             catch (InterruptedException e)             {                 e.printStackTrace();             }         }     });     t.start(); } 

回答1:

You need a reference to that textview and then do:

textView.post(new Runnable() {     public void run() {         textView.setText(yourText);     }  }); 


回答2:

Use runOnUiThread for updating the UI control. In your case:

runningActivity.runOnUiThread(new Runnable() {     public void run() {         tv.setText(p + " %");     } }); 

Edited:

Activity mActivity; public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);      mActivity= this;    ...    ..//The rest of the code } //close oncreate()  thread{     mActivity.runOnUiThread(new Runnable() {         public void run() {             tv.setText(p + " %");         }     }); } 


回答3:

You can use handle :

handler.post(new Runnable() {     public void run() {         textView.setText(yourText);     } }); 

But your textView and yourText must be class fields.

In your thread (activity) where you create textView use:

Handler handler = new Handler(); 

And pass handler into another thread.



回答4:

Either you can use runOnUiThread or use Handler to set text in TextView.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!