android,我想实现循环更新textview,为啥出错?怎么改成正确的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android,我想实现循环更新textview,为啥出错?怎么改成正确的?相关的知识,希望对你有一定的参考价值。

package com.example.test_updateui;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity
private TextView textview;
private Button button;
/*private Handler handler;*/
String zhouyu;
int i=0;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview=(TextView)findViewById(R.id.chatmessage);
button=(Button)findViewById(R.id.start);

button.setOnClickListener(new Button.OnClickListener()
public void onClick(View view)
userthread zy=new userthread();
zy.start();

);


Handler handler=new Handler()
@Override
public void handleMessage(Message msg)
if(msg.what==0x101)
textview.setText(zhouyu);



;

//线程
class userthread extends Thread
userthread()

//this.meg = meg;

public void run()
Message m=new Message();
m.what=0x101;

while(i<1000)

zhouyu=i+"";
/*userthread zy=new userthread();
zy.start();*/
/*textview.setText(zhouyu);*/
handler.sendMessage(m);
i=i+1;

//textview.setText(jindu);


参考技术A 在你的setText之后再调用一下
textview.invalidate();
就可以强制刷新界面了。

另外 因为你的线程循环中没有sleep,所以更新非常快 你也看不到过程的,加上sleep(1000)。本回答被提问者和网友采纳
参考技术B 把你的while循环写到 public void handleMessage(Message msg)
if(msg.what==0x101)
textview.setText(zhouyu);

这个里面就行了试试追问

改了,只显示最后一个值啊,没有动态效果啊

追答

稍等我帮你看看API

参考技术C 你这个while循环瞬间就跑完了,所以直接看到最后一个值。。。。 要想看到变化效果中间加时间间隔

Android 在 Thread 和 Runnable 中更新 TextView

【中文标题】Android 在 Thread 和 Runnable 中更新 TextView【英文标题】:Android update TextView in Thread and Runnable 【发布时间】:2012-09-24 20:59:03 【问题描述】:

我想在 Android 中制作一个简单的计时器,每秒更新一个 TextView。它只是像扫雷一样计算秒数。

问题是当我忽略 tvTime.setText(...) 时(使其成为 //tvTime.setText(...),在 LogCat 中将每秒打印以下数字。 但是当我想将此数字设置为 TextView(在另一个线程中创建)时,程序崩溃了。

有人知道如何轻松解决这个问题吗?

代码如下(启动时调用方法):

private void startTimerThread() 
    Thread th = new Thread(new Runnable() 
        private long startTime = System.currentTimeMillis();
        public void run() 
            while (gameState == GameState.Playing) 
                System.out.println((System.currentTimeMillis() - this.startTime) / 1000);
                tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000));
                try 
                    Thread.sleep(1000);
                
                catch (InterruptedException e) 
                    e.printStackTrace();
                
            
        
    );
    th.start();

编辑:

终于,我明白了。 以下是解决方案,有兴趣的朋友可以参考一下。

private void startTimerThread()        
    Thread th = new Thread(new Runnable() 
        private long startTime = System.currentTimeMillis();
        public void run() 
            while (gameState == GameState.Playing)                 
                runOnUiThread(new Runnable() 
                    @Override
                    public void run() 
                        tvTime.setText(""+((System.currentTimeMillis()-startTime)/1000));
                    
                );
                try 
                    Thread.sleep(1000);
                 
                catch (InterruptedException e) 
                    e.printStackTrace();
                
            
        
    );
    th.start();

【问题讨论】:

感谢 bud,这帮助很大! 但是当你点击返回按钮时它会崩溃 【参考方案1】:

作为一个选项,使用runOnUiThread() 在主线程中更改视图属性。

  runOnUiThread(new Runnable() 
        @Override
        public void run()        
                textView.setText("*** is cool!");
        
    );

【讨论】:

【参考方案2】:

或者,您也可以在您想要更新 UI 元素时在您的线程中执行此操作:

runOnUiThread(new Runnable() 
    public void run() 
        // Update UI elements
    
);

【讨论】:

这是不好的做法吗?使用 Handler 更好? yes..handler 是一个更好的选择。Handler 来自 API 1。【参考方案3】:

您无法从非 UI 线程访问 UI 元素。尝试用另一个Runnable 包围对setText(...) 的调用,然后查看View.post(Runnable) 方法。

【讨论】:

【参考方案4】:

UserInterface 只能由 UI 线程更新。您需要Handler,才能发布到 UI 线程:

private void startTimerThread() 
    Handler handler = new Handler();
    Runnable runnable = new Runnable() 
        private long startTime = System.currentTimeMillis();
        public void run() 
            while (gameState == GameState.Playing)   
                try 
                    Thread.sleep(1000);
                    
                catch (InterruptedException e) 
                    e.printStackTrace();
                
                handler.post(new Runnable()
                    public void run() 
                       tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000));
                
            );
            
        
    ;
    new Thread(runnable).start();

【讨论】:

在我的例子中,有一个文本视图位于一行列表视图中;无法更新其文本属性...有什么建议吗?

以上是关于android,我想实现循环更新textview,为啥出错?怎么改成正确的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Android 处理程序更新 UI 线程中的 TextView?

在 Android Java 中由另一个线程更新 textView

android 实现多textview的滚动

android 使用Handler更新TextView时 手动编辑EditView时根本输入不了任何东西

Android如何在CheckBox检查事件后更新RecyclerView内TextView的文本样式

创建新活动后TextView不更新