AtomicBoolean做什么,一个volatile布尔无法实现?
我在后台线程中运行远程音频文件获取和音频文件播放操作AsyncTask.甲Cancellable进度条示出了用于提取操作运行的时间.
我想AsyncTask在用户取消(决定)操作时取消/中止运行.处理这种情况的理想方式是什么?
我在我的一个活动中实现了AsyncTask:
performBackgroundTask asyncTask = new performBackgroundTask();
asyncTask.execute();
Run Code Online (Sandbox Code Playgroud)
现在,我需要实现"取消"按钮功能,所以我必须停止执行正在运行的任务.我不知道如何停止运行任务(后台任务).
所以请建议我,如何有力地取消AsyncTask?
我找到Cancel()了相同的方法,但我发现调用cancel(boolean mayInterruptIfRunning)不一定会停止执行后台进程.似乎发生的一切是AsyncTask将执行onCancelled(),并且在完成时不会运行onPostExecute().
我正在学习如何取消asyncTask,因此下面的代码没有用处.
我试图调用asyncTask并执行它然后取消它并执行它.
MyAsyncTask asyncTask = new MyAsyncTask();
Log.i("cancel","cancel 1");
asyncTask.execute();
Log.i("cancel","cancel 2");
asyncTask.onCancelled();
Log.i("cancel","cancel 3");
asyncTask.execute();
Log.i("cancel","cancel done");
Run Code Online (Sandbox Code Playgroud)
"取消1"和"取消2"在logcat上显示正确执行,但当"取消3"试图执行时抛出ActivityThread.performLaunchActivity错误.(在logcat上没有显示取消3)我的asyncTask代码有什么问题吗?
private class MyAsyncTask extends AsyncTask<String,Integer,Void>{
private ArrayList<Map<String, String>> list;
private ProgressBar progressBar;
@Override
protected Void doInBackground(String... arg0) {
progressBar = (ProgressBar)findViewById(R.id.year_expense_progressbar);
progressBar.setVisibility(View.VISIBLE);
getListView().setVisibility(View.GONE);
textView.setVisibility(View.GONE);
list = new ArrayList<Map<String, String>>();
String time = "";
String category = "";
String expense = "";
String day = "";
String month = "";
totalExpense = 0;
Cursor c = SQLLiteAdapter.fetchAllItems();
while(c.moveToNext() != false){
if(isCancelled()){
Log.e("cancel","cancel …Run Code Online (Sandbox Code Playgroud)