在 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的主要内容,如果未能解决你的问题,请参考以下文章

计算同一列之间的差异,在python中由另一列分组的连续行

访问由另一个线程创建的对象而不每次都调用?

通过在 android/java 中由 JavaScript 编写的函数在 FCM 中的同一应用程序中制作多种类型的通知

从文件中动态更新 Qdialog 中的 QTextBrowser(由另一个作业更新)

Java中的非阻塞异步IO

子线程是否可以更新UI-Android