从工作线程在主线程中呈现项目的问题

问题描述 投票:0回答:1

我创建了一个计数器应用程序,它从 0 计数到无穷大,直到使用停止按钮停止循环。该应用程序包含 2 个按钮(开始和停止)和 1 个文本视图。 我的目标是在文本视图中显示从 0 到无穷大(直到循环停止)的值。我正在使用 while 循环。

例如,计数值从 0 开始,因此 while 循环从 0 开始,一直持续到使用停止按钮终止循环为止。我想在文本视图中实时显示值。

public class MainActivity extends AppCompatActivity {

    boolean start;
    int count=0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt1=findViewById(R.id.button);
        Button bt2=findViewById(R.id.button2);
        TextView tv=findViewById(R.id.textView);
        Handler h=new Handler(getApplicationContext().getMainLooper());
        

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start=true;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(start){
                                count=count+1;
                        }
                        h.post(new Runnable() {
                            @Override
                            public void run() {
                                tv.setText(" "+count);
                            }
                        });
                    }
                }).start();

            }
        });
        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start=false;
            }
        });
    }
}

上面的代码没有在文本视图中实时显示值。有什么问题?另外,我应该为此类任务使用处理程序还是 runonUIThread?

帮助将不胜感激!

java android android-handler ui-thread android-runonuithread
1个回答
0
投票

你应该使用

runOnUiThread
,因为
while
循环阻塞了 UI 线程。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        tv.setText(" "+count);
    }
});

这里是重构代码以使其正常工作。

public class MainActivity extends AppCompatActivity {

    boolean start;
    int count=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt1=findViewById(R.id.button);
        Button bt2=findViewById(R.id.button2);
        TextView tv=findViewById(R.id.textView);

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start=true;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(start){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    tv.setText(" "+count);
                                }
                            });
                            count++;
                        }
                    }
                }).start();
            }
        });

        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start=false;
            }
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.