我是 Java Android 的新手,我想知道如何從另一個擴展 Thread(而不是擴展 Activity)的 Thread 更新 TextView 中的文本,我已經搜索過,人們說要使用 runOnUiThread。但是由于我的類“myThread”擴展了 Thread,我不能使用這個方法(因為我應該從 Activity 擴展,但我必須從 Thread 擴展)。
我的執行緒代碼:
public class myThread extends Thread{
@Override
public void run() {
// do my stuff...
//....
runOnUiThread(new Runnable(){
//HOW?????????
});
}
}
uj5u.com熱心網友回復:
您不必從 Acitivity 類擴展。如果你有相關活動的參考,你可以呼叫這個活動的方法。
場景一
如果你有 Activity 類 YourActivity,而不是撰寫新類,你可以在你的方法中創建匿名執行緒。
public class YourAcitivity extends Activity
{
private TextView view;
private Thread textViewUpdateThread;
...
...
...
public void someMethod()
{
this.textViewUpdateThread = new Thread(() -> {
this.runOnUiThread(() -> {
// Do your stuff here.
});
});
this.textViewUpdateThread.start();
}
}
場景二
您可以撰寫自己的執行緒類,該類接受目標活動參考作為建構式引數。通過這種方式,在您的執行緒類中,您可以訪問要操作的目標活動。在這種情況下,您必須將相關的 getter/setter 添加到您的活動類中以訪問 gui 組件,例如 TextView。
public class YourSpecialThread extends Thread
{
private Activity targetAcitivity;
public YourSpecialThread(Activity activity)
{
this.targetAcitivity = targetAcitivity;
}
@Override
public void run() {
this.targetAcitivity.runOnUiThread(new Runnable(){
// Do your stuff here.
// Do not forget to add getter methods to your activity for accessing the
// related GUI components such as your text view.
this.targetAcitivity.getTextView().setText("....");
});
}
}
場景3
最后一種可能的情況是,您可以將活動類中的執行緒類實作為內部靜態類。通過這種方式,您可以訪問外部類變數(在您的情況下外部類是 Acitivity)并呼叫 Acitivity 類的 runOnUiThread 方法。
uj5u.com熱心網友回復:
另一種方法是使用如下處理程式。
public class myThread implements Runnable, Handler.Callback
{
private WeakReference<TextView> textview;
private Handler uiHandler;
public myThread(TextView textview)
{
this.textview = new WeakReference<TextView>(textview);
uiHandler = new Handler(Looper.getMainLooper(), this);
new Thread(this).start();
}
Override
public void run()
{
//Do something
uiHandler.sendEmptyMessage(0); //Set textview's text.
}
@Override
public boolean handleMessage(Message msg)
{
final TextView textview = this.textview.get();
if(textview == null) return false;
switch(msg.what) {
case 0: textview.setText("Hello World"); break;
case 1: textview.setTextColor(Color.BLUE); break;
default: return false;
}
return true;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/391209.html
