【问题标题】:Update the UI with dynamic text使用动态文本更新 UI
【发布时间】:2012-03-02 19:45:20
【问题描述】:

我希望每 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);
           }
       }
   )
}

【问题讨论】:

  • 文本是否会在应用程序的整个生命周期内每 5 秒更新一次?或者一分钟只需 5 秒(例如)?
  • 首先删除 Thread.sleep 然后它应该可以工作......但这取决于你如何设置标题和艺术家字段......编辑:是的,Rawr 做得对,每 5 秒这样做会耗尽电池

标签: android view android-activity textview


【解决方案1】:

我会使用处理程序。

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 毫秒会“做一些事情”。您可以通过将 WHAT 作为不同的整数传入并在 handleMessage 函数中处理来使 Handler 对不同的事件做出反应。

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

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

regularHandler.removeMessages(WHAT)

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;
        }
    });
}

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

【讨论】:

  • 你能举一个小例子,说明我如何将它与计时器集成,它们几乎接缝冲突
  • 完全移除 Timer,这就是 Handler 的作用。
【解决方案2】:

使用处理程序是一个很好的策略,但您实际上并不需要自定义回调。相反,您可以将postDelayedRunnable 一起使用。有关实施的详细信息,请参阅此Android doc

【讨论】:

    【解决方案3】:
    runOnUiThread(new Runnable() {  
        public void run() {
            textTitle.setText(title);
        }
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多