在android studio中,wait()函数在线程中不工作

在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

在问这个问题之前,让我告诉你我是android开发的新手。 我的问题是关于线程和等待();功能。现在我正在尝试实现线程,该线程应该每3秒更改文本的颜色,但程序在我启动后立即崩溃。这是代码

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(任务)
和add
mHandler.removeCallbacks(这个)在runnable内并删除
mHandler.postDelayed(任务,3000)从runnable开始,它现在就像是一个重复的任务,什么都不做。