【问题标题】:Updating TextView using handler使用处理程序更新 TextView
【发布时间】:2012-07-21 03:08:08
【问题描述】:

我正在尝试制作一个从 5 计数到 1 的简单计数器,并在每秒更新一次视图。我试过在没有处理程序的情况下只用一个简单的循环来做这件事,但它只是在等待后向我显示 1 或者它强制关闭。我也试过弄乱runOnUIThread 和线程,但我错过了一些东西。

这是我的代码:

package com.ammad.test;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.support.v4.app.NavUtils;

public class Main extends Activity {

    TextView tv;
    Button b1;
    Handler mHandler;
    int i = 5;
    private Runnable runnable;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tvShow);
        b1 = (Button) findViewById(R.id.bt1);



        runnable = new Runnable() {
            public void run() {
                // do your stuff - don't create a new runnable here!
                tv.setText(String.valueOf(i));
                i--;
                mHandler.postDelayed(runnable, 500);

            }
        };
        b1.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                mHandler.post(runnable);
                mHandler.removeCallbacks(runnable);

            }
        });

    }

    public void doTheLoop() {

        /*
         * runOnUiThread(new Runnable() {
         * 
         * public void run() { for (int i = 5; i >= 1; i--) { // TODO
         * Auto-generated method stub tv.setText(Integer.toString(i)); for (int
         * j = 0; j < 200000; j++) ; } }
         * `enter code here`
         * });
         */
        // mHandler.post(runnable);
    }
}

【问题讨论】:

    标签: android android-ui runnable android-handler


    【解决方案1】:

    你在哪里实例化mHandler?我认为该代码丢失了,否则会因 NullPointerException 而失败。这很重要,因为如果你只是用onCreate 中的无参数构造函数来实例化它,它将使用 UI 线程的消息队列。

    这还有其他问题:在您的Runnable.run 方法中,您实际上并没有检查i 是否小于零,因此它总是会自己调用postDelayed。此外,您正在从非 UI 线程更新 UI (setText),这可能会导致未定义的行为。

    我认为您的代码比它需要的要复杂一些。如果这个例子被简化并隐藏了你的实际意图,这个例子可能太简单了,但这里有一些基本可以工作的东西,尽管你需要稍微编辑它才能编译(捕获 InterruptedException 等)

        new Thread() {
            public void run() {
                while(i > 0) {
                    Thread.sleep(1000);
                    mTextView.post(new Runnable() {
                        public void run() {
                            mTextView.setText(Integer.toString(i--));
                        }
                    });
                }
            }
        }.start();
    

    【讨论】:

    • 比很多老兄...你是救星...我一直在尝试做同样的事情,但我想我错过了这个 mTextView.post...thanx 再次......
    猜你喜欢
    • 2017-03-13
    • 2013-03-19
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多