在 Android Java 中由另一个线程更新 textView
Posted
技术标签:
【中文标题】在 Android Java 中由另一个线程更新 textView【英文标题】:Update textView by another Thread in Android Java 【发布时间】:2022-01-21 05:39:56 【问题描述】:我是 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?????????
);
【问题讨论】:
为什么一定要扩展Thread?为什么不直接实现 Runnable? 【参考方案1】:您不必从 Acitivity 类扩展。如果您有相关活动的引用,您可以调用该活动的方法。
场景 1
如果你有 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();
场景 2
您可以编写自己的线程类,接受目标活动引用作为构造函数参数。通过这种方式,在您的线程类中,您可以访问要操作的目标活动。在这种情况下,您必须将相关的 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 方法。
【讨论】:
我使用了场景 2。谢谢,它可以工作【参考方案2】:另一种方法是使用如下处理程序。
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;
【讨论】:
以上是关于在 Android Java 中由另一个线程更新 textView的主要内容,如果未能解决你的问题,请参考以下文章
通过在 android/java 中由 JavaScript 编写的函数在 FCM 中的同一应用程序中制作多种类型的通知