android - 从 Thread 更新 TextView 仅在 Thread 之后更新

标签 android multithreading android-fragments textview

我正在尝试制作一个类似书籍的应用程序,其中包含图片和文字。我为此使用了 fragment ,并添加了一个声音,当 fragment 页面可见时开始,当它不可见时停止。

我现在正在尝试突出显示画外音中的一个词。到目前为止,这是我的代码

fragment 中:

    @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    // Make sure that we are currently visible
    if (this.isVisible()) {

        if(MainActivity.soundOn){
            if(!MainActivity.mediaPlayer.isPlaying()){
                try {
                    MainActivity.mediaPlayer.prepare();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                MainActivity.mediaPlayer.start();
                MainActivity.start(getActivity(), sentence);
            }

            //MainActivity.test(sentence);
            MainActivity.mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    //MainActivity.start();
                }
            });
        }
        // If we are becoming invisible, then...
        if (!isVisibleToUser || !MainActivity.soundOn) { 
            stopPlaying(getActivity());
        }

    }
}

在主要 Activity 中:

public static void start(Activity activity, Sentence sent){
    //textControl.start();
    try{
        player = new Player(activity);
        player.set(sent, textControl);

        textControl.draw(sent, sent.words.get(0));

                    //while the mediaplayer is playing the voice over
        while(mediaPlayer.isPlaying())
        {
            player.run();
        }
    }
    catch(Exception e){
        e.printStackTrace();
    }

线程,我已经删除了大部分代码以进行测试和可读性:

    class Player extends Thread{

public int time;
public TextController control;
public int i = 1;
TextView tv;

private WeakReference<Activity> mActivity;
private Sentence sentence = null;

public Player(Activity activity) {
    mActivity = new WeakReference<Activity>(activity);
}

public void set(Sentence _sentence, TextController _control){
    sentence = _sentence;
    control = _control;
}


@Override
public void run()
{

    final Activity activity = mActivity.get();

    tv = (TextView) activity.findViewById(R.id.textView1);

        activity.runOnUiThread(new Runnable() {

            public void run() {

                    tv.setText("Testing");
                                //other stuff
            }
        });
    }
}

我想知道为什么代码“tv.setText("Testing");"不会在执行后立即更新 textview 吗?相反,它会在 setUserVisibleHint(boolean isVisibleToUser) 方法完成后的某个时间更新 TextView 。

我也乐于接受有关更好的方法的建议。

如果您想了解有关任务和问题的更多背景信息,请随时询问,因为我的信息已经很简短了,谢谢!

带有 textView 的 fragment 的 XML:

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:onClick="toggleAction">

<TextView
    android:id="@+id/textView1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:gravity="center_horizontal"
    android:text="@string/fragment1"
    android:textSize="50sp" />

</LinearLayout>

最佳答案

我无法使用此线程解决此问题,因此尝试使用 AsyncTask。这通过在 onProgressUpdate 中更新 TextView 非常有效

@Override
protected void onProgressUpdate(Spannable... result){
    view.setText(result[0]);
    view.invalidate();
}

关于android - 从 Thread 更新 TextView 仅在 Thread 之后更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21394012/

相关文章:

android:在 TextView 中使用 <a href> 设置链接

linux - 从单线程应用程序调用pthread_self()

java - 如何在 Java 中调用具有单独线程的方法?

android - 将对象列表传递给 fragment

Android - 通过点击按钮登录 Facebook

java - 如何从线程获取数据到另一个类

java - 从 Android 应用程序将数据插入 MySQL 数据库。更改未反射(reflect)在数据库中

java - 如何在 SQLite Java 中设置线程模式

安卓 fragment 布局

java - 如何从另一个 fragment 打开一个 fragment