Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我的程序只显示了i的最后一个值_Android_Multithreading_Textview - Fatal编程技术网

Android 我的程序只显示了i的最后一个值

Android 我的程序只显示了i的最后一个值,android,multithreading,textview,Android,Multithreading,Textview,为什么这个程序只显示textview中i=4的最后一个值 Public class MainActivity extendsActivity { TextView counter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac

为什么这个程序只显示textview中i=4的最后一个值

    Public class MainActivity extendsActivity {
        TextView counter;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            counter = (TextView) findViewById(R.id.TV_counter);
            Thread t = new Thread() {
                public void run() {
                    runOnUiThread(new Runnable() {
                        public void run() {
                            for (int i = 0; i < 5; i++) {
                                try {
                                    counter.setText("" + i);
                                    System.out.println("Value of i= " + i);
                                    sleep(100);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                }
            };
            t.start();
        }
    }
公共类MainActivity ExtendActivity{
文本视图计数器;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
计数器=(TextView)findViewById(R.id.TV_计数器);
线程t=新线程(){
公开募捐{
runOnUiThread(新的Runnable(){
公开募捐{
对于(int i=0;i<5;i++){
试一试{
counter.setText(“+i”);
System.out.println(“i的值=”+i);
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
});
}
};
t、 start();
}
}

睡眠时间不是很长。您可能只是没有注意到它正在非常快速地更新字段。试着把睡眠增加到1000

我不完全确定你想做什么,但我认为这正是你需要的。另外,正如其他人所说,你可能想增加睡眠时间,只是为了确保它起作用。1000毫秒怎么样

Thread t = new Thread()
{
   public void run() 
   {
      for(int i=0;i<5;i++)
      {
          runOnUiThread(new Runnable() 
          {
             public void run() 
             {
                try 
                {
                   counter.setText(""+i );
                   System.out.println("Value of i= "+i);
                }      
                catch (InterruptedException e) 
                {
                   e.printStackTrace();
                 }
              }
           });
           sleep(100);
      }
   });
}
Thread t=新线程()
{
公开募捐
{

对于(inti=0;i增加睡眠时间,使变化对人眼可见

sleep(2000); 
(或)将计数器的现有文本

counter.setText(counter.getText()+i);
但是你检查过你的控制台了吗?因为它一定有
i=1到4的值

您应该在主线程上发布要执行的setText,它很简单,如下所示:

counter.getHandler().post(new Runnable(){public void run(){counter.setText("" + i);}});

可能是因为它每10秒就改变一次。日志输出正确的数字吗?睡眠不是以毫秒为参数吗?因为你只做了5次迭代,所以整个过程都以毫秒为单位运行500ms@MarcB是的,我在这里看到的问题是您正在
UI线程上睡觉
,执行
sleep()
,在工作线程上运行for循环,并使用
runOnUIThread()
仅用于执行
setText()
。这应该可以解决您的问题。睡眠(1000)的相同问题请参见问题。OP正在使用
runOnUIThread()执行
setText()
我可以在我的问题中使用处理程序吗?
rununuithread
效果很好。请参阅我对该问题的评论以解决您的问题。我没有注意到rununuithread。但是向处理程序发帖会更好地安排在UI生命周期中执行Runnable。我检查了我的consle,并显示了一个真正的计数器,只是我需要在textview中,而不是在co中nsoleI尚未测试此代码,但这就是它所做的。它应该每100毫秒更新一次代码。但为了测试起见,请将其设置为1000毫秒,以便您可以看到它实际更新。
counter.getHandler().post(new Runnable(){public void run(){counter.setText("" + i);}});