使用动态文本更新UI

Bri*_*njs 2 android view textview android-activity

我希望每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);
           }
       }
   )
}
Run Code Online (Sandbox Code Playgroud)

Kno*_*sos 5

我会使用Handler.

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);
Run Code Online (Sandbox Code Playgroud)

例如,每隔5000毫秒就会"填充".您可以通过将WHAT作为一个不同的整数传入并在handleMessage函数中处理它来使Handler对不同事件做出反应.

编辑:我通常将常量和Handler作为成员放在类中,并将onHesume()放在onResume(){}中的regularHandler.sendEmptyMessageDelayed(...)中

我也会把它放在onPause(){}

regularHandler.removeMessages(WHAT)
Run Code Online (Sandbox Code Playgroud)

Edit2:示例:

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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

您需要在onResume()和onPause()中执行此操作,因为如果您不将它放在onPause中,则当您的Activity不在前台时,Handler将继续循环.您将希望循环在返回前景时再次启用(因此onResume()).