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(); } 34 Answers
You need a reference to that textview and then do:
textView.post(new Runnable() { public void run() { textView.setText(yourText); } }); in Kotlin:
val textView: TextView = findViewById(R.id.textView) textView.post(Runnable { textView.setText(yourText) }) 6Use 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 + " %"); } }); } 3Either you can use runOnUiThread or use Handler to set text in TextView.
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.