我正在尝试创建一个应用程序,每隔一分钟检查一次电池状态,并使用电池级别更新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秒?
答案 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();
});
}