在android studio中,wait()函数在线程中不工作
在问这个问题之前,让我告诉你我是android开发的新手。 我的问题是关于线程和等待();功能。现在我正在尝试实现线程,该线程应该每3秒更改文本的颜色,但程序在我启动后立即崩溃。这是代码在android studio中,wait()函数在线程中不工作,android,multithreading,java-threads,Android,Multithreading,Java Threads,在问这个问题之前,让我告诉你我是android开发的新手。 我的问题是关于线程和等待();功能。现在我正在尝试实现线程,该线程应该每3秒更改文本的颜色,但程序在我启动后立即崩溃。这是代码 package care.client_application; public class MainActivity extends AppCompatActivity { Thread Thread3=null; //Coloring thread public TextView Warning
package care.client_application;
public class MainActivity extends AppCompatActivity {
Thread Thread3=null; //Coloring thread
public TextView Warning;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Warning= (TextView) findViewById(R.id.warning);
UIHandler = new Handler(); //Initialization of handler
this.Thread3= new Thread(new Thread3());
this.Thread3.start();
}
class Thread3 implements Runnable{
@Override
public void run() {
Warning.setTextColor(Color.rgb(200,200,0));
wait(3000);
Warning.setTextColor(Color.rgb(200,0,0));
}
}
}
首先,您不能在线程的Run方法上更新任何UI组件 喜欢你做的事
Warning.setTextColor(Color.rgb(200,200,0)); // this wrong way to do this
使用处理程序执行任何UI更新
public class MainActivity extends AppCompatActivity {
private TextView warningText;
private final long TIME_TO_CHANGE = 3000;
private Handler handler = new Handler();
private int counter = 0;
private int[] R = {0, 200}, G = {0, 200}, B = {200, 0};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
warningText = (TextView) findViewById(R.id.warning);
warningText.setTextColor(Color.rgb(0,0,0));
handler.postDelayed(new Runnable() {
@Override
public void run() {
updateTextColor();
handler.postDelayed(this, TIME_TO_CHANGE);
}
}, TIME_TO_CHANGE);
}
private void updateTextColor(){
runOnUiThread(new Runnable() {
@Override
public void run() {
counter = (counter+1)%2;
warningText.setTextColor(Color.rgb(R[counter],G[counter],B[counter]));
}
});
}
@Override
public void onPause(){
super.onPause();
handler.removeCallbacksAndRunnables(null);
}
}
对需要等待的任务使用处理程序。Android中不建议使用Thread.sleep()
我想每3秒钟更改一次文本的颜色
为什么不使用处理程序
而不是线程
private Runnable task = new Runnable () {
public void run() {
//update textview color
Warning.setTextColor(Color.rgb(200,200,0));
mHandler.postDelayed(task, 3000); //repeat task
}
};
使用以下命令调用它:
private Handler mHandler = new Handler();
// call updateTask after 3 seconds
mHandler.postDelayed(task, 3000);
要停止任务,请执行以下操作:
@Override
protected void onPause() {
mHandler.removeCallbacks(task);
super.onPause();
}
首先,你不应该使用它冻结用户界面,这不是一个好方法。 第二,如果必须这样做,则必须使用runonuithread as在运行时更改ui,您必须这样做:
class Thread3 implements Runnable{
@Override
public void run() {
getActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
Warning.setTextColor(Color.rgb(200,200,0));
}
});
wait(3000);
getActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
Warning.setTextColor(Color.rgb(200,0,0));
}
});
}
我希望它能帮助你让我知道它是否有效。祝您好运。发布您的错误错误可能是,只有创建视图的线程才能修改它。我说的对吗?感谢兄弟提供了简单有效的解决方案…快乐编码这个解决方案是每3秒改变一次文本颜色还是只改变一次@ZubairRasheedTask正在重复,但文本颜色是否在切换?并不是说您的答案是错误的,但如果颜色仅改变一次,则您可以删除
mHandler.removeCallbacks(任务)
和addmHandler.removeCallbacks(这个)代码>在runnable内并删除mHandler.postDelayed(任务,3000)代码>从runnable开始,它现在就像是一个重复的任务,什么都不做。