Android 使用动态文本更新UI

Android 使用动态文本更新UI,android,view,android-activity,textview,Android,View,Android Activity,Textview,我希望每5秒钟更新一次屏幕上的文本,我已经创建了一个计时器来完成这项工作。但是,在第一次更新之后,它将不再更新该框。我假设我需要刷新视图或其他东西,但我现在确定如何更新,有什么想法吗 public class HomeActivity extends Activity implements OnClickListener { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst

我希望每5秒钟更新一次屏幕上的文本,我已经创建了一个计时器来完成这项工作。但是,在第一次更新之后,它将不再更新该框。我假设我需要刷新视图或其他东西,但我现在确定如何更新,有什么想法吗

public class HomeActivity extends Activity implements OnClickListener {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textTitle = (TextView) findViewById(R.id.textTitle);
        textArtist = (TextView) findViewById(R.id.textArtist);
        timedMeta();
}
static void timedMeta()
{
    timer.scheduleAtFixedRate(   
        new TimerTask() {
            public void run() {
                try{      
                    textTitle.setText(title);
                    textArtist.setText(artist); 
                    }
                Thread.sleep(UPDATE_INTERVAL);
                catch (Exception e) 
                { 
                },
                DELAY_INTERVAL,
                UPDATE_INTERVAL);
           }
       }
   )
}
我会用一个处理器

private static final int WHAT = 1;
private static final int TIME_TO_WAIT = 5000;

Handler regularHandler = new Handler(new Handler.Callback() {
    public boolean handleMessage(Message msg) {
        // Do stuff

        regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT);

        return true;
    }
});

regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT);
例如,这将每5000毫秒“做一些事情”。您可以通过传入不同的整数并在handleMessage函数中处理,使处理程序对不同的事件作出反应

编辑:我通常将常量和处理程序作为成员放置在类中,并将regularHandler.sendEmptyMessageDelayed(…)放置在onResume(){}

我还要把它放在onPause(){}

编辑2:示例:

public class HomeActivity extends Activity implements OnClickListener {
    private static final int WHAT = 1;
    private static final int TIME_TO_WAIT = 5000;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textTitle = (TextView) findViewById(R.id.textTitle);
        textArtist = (TextView) findViewById(R.id.textArtist);
    }

    @Override
    public void onResume() {
        super.onResume();
        regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT);
    }

    @Override
    public void onPause() {
        super.onPause();
        regularHandler.removeMessages(WHAT);
    }

    Handler regularHandler = new Handler(new Handler.Callback() {
        public boolean handleMessage(Message msg) {
            // Do stuff

            regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT);

             return true;
        }
    });
}

您需要在onResume()和onPause()中执行此操作,因为如果不将其置于onPause中,当您的活动不在前台时,处理程序将继续循环。当循环返回前台时,您会希望它再次启用(因此onResume())。

使用处理程序是一个不错的策略,但实际上并不需要自定义回调。相反,您可以将
postDelayed
Runnable
一起使用。有关实现的详细信息,请参见本文

runOnUiThread(new Runnable() {  
    public void run() {
        textTitle.setText(title);
    }
});

无法从后台线程更新UI。每当你想修改UI时,建议使用UI线程

你能举一个小例子说明我如何将其与计时器集成,它们几乎是无缝冲突完全删除计时器,这就是处理程序的用途。文本是否会在应用程序的整个生命周期内每5秒更新一次?或者仅仅5秒一分钟(例如)?首先删除线程。睡眠然后它应该工作。。。但这取决于你如何设置标题和艺术家字段。。。。编辑:是的,Rawr是对的,每5秒做一次会杀死电池
runOnUiThread(new Runnable() {  
    public void run() {
        textTitle.setText(title);
    }
});