Android是否可以使用Thread.sleep(60000)而无需获得ANR

时间:2014-09-02 15:25:07

标签: android android-anr-dialog

我正在尝试创建一个应用程序,每隔一分钟检查一次电池状态,并使用电池级别更新UI。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    batteryPercent = (TextView) this.findViewById(R.id.battery);
    while (true) {
        runOnUiThread(mRunnable);
    }
}

private Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
        getBatteryPercentage();

        try {
            Thread.sleep(60000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

`getBatteryPercentage()1更新UI上的文本视图。

当我只在代码正常工作时调用getBatteryPercentage(),但当我尝试在上面的循环中运行它时,几秒钟后我得到应用程序无响应(ANR)。

有没有办法让应用程序在没有得到ANR的情况下等待60秒?

3 个答案:

答案 0 :(得分:1)

您可以使用Handler.postDelayed

Handler handler =  new Handler();

private Runnable mRunnable = new Runnable() {
@Override
    public void run() {
        getBatteryPercentage();
        handler.postDelayed(mRunnable, 60000);
    }
}

然后:

handler.postDelayed(mRunnable, 60000);

答案 1 :(得分:1)

不要睡觉。请改用CountDownTimer

CountDownTimer _timer;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    batteryPercent = (TextView) this.findViewById(R.id.battery);

    _timer = new CountDownTimer(Long.MAX_VALUE, 60000) { 

         @Override 
         public void onTick(long millisUntilFinished) 
         { 
              getBatteryPercentage();
         } 


         @Override public void onFinish() {} 
    }; 
    _timer.start();

不要忘记在Activity退出之前调用_timer.cancel()。

答案 2 :(得分:0)

如果你在android uithread中做了超过5秒的事情,应用程序将显示ANR toast。 你应该在另一个线程中执行while循环,并使用回调来刷新ui.you可以这样做:

new Thread(new Runnable(){
public void run(){
  try{
     Thread().sleep(6*1000);
     updateUI();
 }catch( Exception e){
   e.print***();
 }}}).start();

private void updateUI(){
   runOnUiThread(new Runnable(){
     getBatteryPercentage();
   });
}