【问题标题】:Update textView by another Thread in Android Java在 Android Java 中由另一个线程更新 textView
【发布时间】: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?

标签: java android multithreading mobile


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2019-07-25
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多