【问题标题】:When I change text and show it on UI in Thread, nothing is done (JAVA)当我更改文本并将其显示在 Thread 的 UI 上时,什么也没做(JAVA)
【发布时间】:2019-06-16 08:04:23
【问题描述】:

这段代码在MainActivity的OnCreate中

    inflater = getLayoutInflater();
    serversView = inflater.inflate(R.layout.layout_home, null, false);
    test = serversView.findViewById(R.id.titleDescription);

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try  {


                    //some code
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            test.setText(utf8text+"mk");

                            Log.i(LOG_TAG,"serversView: "+ serversView + " test: "+ test + " test.getText().toString():"+ test.getText().toString());
                        }
                    });


            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();

使用类 Thread 是强制性的! 当我登录Log.i(LOG_TAG," test.getText().toString():"+ test.getText().toString()); 一切正常时,文本已更改,但在 UI 中什么也没做。有什么问题?

更新: 当我这样做时:

runOnUiThread(new Runnable() { @Override public void run() { textView.setText(utf8text); Log.i(LOG_TAG,"textView.getText: "+ textView.getText().toString()); } });

如果 textView 在 main_activity.xml 中,那么它会改变。但是如何做,例如使用 LayoutInflater 来获取和更改另一个片段/活动中的 TextView?

【问题讨论】:

    标签: java android multithreading layout-inflater java-threads


    【解决方案1】:

    在 run 方法中添加以下行

    serversView.invalidateViews();

    例如,

    public void run() {
        test.setText(utf8text+"mk");
        serversView.invalidateViews();
        Log.i(LOG_TAG,"serversView: "+ serversView + " test: "+ test + "test.getText().toString():"+ test.getText().toString());
    }
    

    【讨论】:

    • 请尝试使用serversView.invalidate()
    【解决方案2】:

    UI不能被非UI线程更新,但是android提供了android.os.Handler类或者AsyncTasks类,下面是thread handler的示例代码试试吧。

    public class MainActivity extends AppCompatActivity {
    private ProgressBar progress;
    private TextView text;
    Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progress = findViewById(R.id.progressBar1);
        text = findViewById(R.id.textView1);
        handler = new Handler();
    }
    public void startProgress(View view) {
        // do something long
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 10; i++) {
                    final int value = i;
                    doFakeWork();
                    handler.post(new Runnable(){
                        @Override
                        public void run() {
                            progress.setProgress(value);
                            if(value!=10)
                                text.setText("updated");
                            else
                                text.setText("updating");
                        }
                    });
                }
            }
        };
        new Thread(runnable).start(); }
        // Simulating something timeconsuming
    private void doFakeWork() {
        try { SystemClock.sleep(5000);} catch (Exception e) {e.printStackTrace();}}}
    

    希望对你有帮助,祝你好运。

    【讨论】:

    • 它没有帮助。可能需要在 OnCreate 中放入 startProgress 方法吗?
    • 以上 startProgress 方法没有响应按钮单击事件。我在xml布局中按钮的onclick属性中添加了这个方法,有没有报错?
    • 我在 OnCreate 中插入了这个,但是 textview 并没有改变 UI 中的文本,但是在记录时 - 改变了
    • 哦,我意识到你需要在点击按钮的时候插入它,我做了所有的事情,但是在 UI 中并没有像以前那样改变任何东西,并且在记录更改时
    • 使用线程处理程序 UI 肯定会更新。我正在另一个答案中更新您的代码。
    【解决方案3】:

    线程处理类,试试吧。

    public class MainActivity extends AppCompatActivity {
    
    TextView test;
    Handler handle;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        test = findViewById(R.id.titleDescription);
        handle = new Handler();
    
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                test.setText("Hey! Text Changed");
            }
        };
        new Thread(runnable).start();
    
    }
    

    }

    【讨论】:

    • 您可以将数据从当前活动传递到另一个活动(使用显式 Intent)或片段(通过为该片段设置参数),然后在 UI 中使用该数据。
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2015-12-09
    • 2014-05-18
    • 2019-03-30
    • 2019-03-21
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多