Android-android执行长时间操作如何处理,如何避免ANR?
工作时碰到一个问题,就是要在一个功能界面执行删除一个音乐列表的任务,同时删除所有相应实际的媒体文件,这个列表如果很大,比如一千首歌曲,那么时间可能会比较长,会引发无响应的问题,也就是ANR.如何避免这种情况。要求删除的过程能向用户弹出提示框,表示正在删除,而且点击不能取消。另外,如果是在原有的基础上(删除函数是现在UI点击响应函数里面)修改,怎么样可以修改幅度最小?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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();
}
}
};
}
})
这个现象一般出现在非UI线程操作UI线程时,这是由android的单线程模型决定的,UI操作并不是线程安全的并且这些操作必须在UI线程中执行。android提供几种方法来解决这个问题:
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
AsyncTask
其中AsyncTask使用相对简单,具体使用参考一下:AsyncTask的用法
asynctask 完美解决你的问题...