Android-android执行长时间操作如何处理,如何避免ANR?

Android-android执行长时间操作如何处理,如何避免ANR?

泛泛之交 发布于 2017-09-22 字数 369 浏览 1050 回复 3

工作时碰到一个问题,就是要在一个功能界面执行删除一个音乐列表的任务,同时删除所有相应实际的媒体文件,这个列表如果很大,比如一千首歌曲,那么时间可能会比较长,会引发无响应的问题,也就是ANR.如何避免这种情况。要求删除的过程能向用户弹出提示框,表示正在删除,而且点击不能取消。另外,如果是在原有的基础上(删除函数是现在UI点击响应函数里面)修改,怎么样可以修改幅度最小?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

想挽留 2017-10-17 3 楼

比如原删除任务在界面的onclick函数中:

public void onClick(DialogInterface dialog, int whichButton) {
deleteAllMusics();
}

使用新建工作线程来执行这个删除操作,删除过程中弹出等待提示框,删除线程执行完毕之后还要取消提示框。弹出和取消提示框的代码如下:

ProgressDialog progressDlg; //提示框
Handler resHandler = null; //用于处理线程工作结束的消息

private void showProgressDialog() {
progressDlg = new ProgressDialog(TrackBrowserDeleteActivity.this);
progressDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDlg.setMessage(getString(R.string.delete_music_message));
progressDlg.setCancelable(false);
progressDlg.setCanceledOnTouchOutside(false);
progressDlg.show();
}

private void dismissProgressDialog() {
if(progressDlg != null)
progressDlg.dismiss();
}

原有的函数改成如下:

 public void onClick(DialogInterface dialog, int whichButton) {
showProgressDialog();//删除开始弹出提示框
Thread thread = new Thread(new Runnable() {
public void run() {
deleteAllMusics();//变成线程中执行删除
resHandler.sendEmptyMessage(0);
//通知主线程删除任务结束

` `}
}
);
thread.start();

resHandler = new Handler() //删除结束取消弹出框
{
public void handleMessage(Message msg)
{
super.handleMessage(msg);
try
{
dismissProgressDialog();
}
catch (Exception e)
{
e.printStackTrace();
}
}
};
}
})

归属感 2017-10-12 2 楼

这个现象一般出现在非UI线程操作UI线程时,这是由android的单线程模型决定的,UI操作并不是线程安全的并且这些操作必须在UI线程中执行。android提供几种方法来解决这个问题:
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
AsyncTask
其中AsyncTask使用相对简单,具体使用参考一下:AsyncTask的用法

夜无邪 2017-10-09 1 楼

asynctask 完美解决你的问题...