我正在运行一个队列,我正在下载视频并使队列正常工作,需要强制调用 AsyncTask 的 postExecute .. 或者必须有一个事件,当我的 asynctask 被处理器杀死时我可以得到它说“没有更多的后台任务”..内存不足..OnCancelled 也没有被调用...有什么帮助吗???
@kdehairy Intent 服务???好的,实际上我需要更新我的用户界面。例如,我有一个正在下载的视频,它是在异步任务中启动的,我会跟踪该 block 并相应地更新我的自定义进度条,如果用户破坏了 Activity 我不会取消我的 ansynctask 直到我的工作完成完成..我跟踪 asynctask..如果由于某种原因我的 asynctask 停止,即使它在后台...它再次询问任务..这是由服务完成的...我说的是即使我不知道我的 asynctask从服务或应用程序排队...但我只是跳过正在排队的 asyncatsks 的轨道..并从堆栈中推送和弹出..asynctask postexecute 刷新我的 View ...就像如果 asynctask 正在从服务运行我检查 postExecute 如果我UI 屏幕是可见的...比我调用新的 Intent..with Flags SingleTop 和 New Task 这样我可以刷新我的进度条..我可以使用 IntentService 更新我的 UI 吗..它会在 UIThread 还是工作线程上运行..
你能给我举个例子吗...??? 谢谢 Kdehairy
最佳答案
如果处理流程的生命周期对您来说至关重要,那么最好使用服务。 AsyncTask 不是系统组件(服务是)。
更新:
- 使用您自己的实现扩展
IntentService
。 要更新 UI,您可以使用广播。如下:
- 每当您需要更新 UI 时,请在您的服务中写入:
在这里,我们使用Intent intent = new Intent(ACTION_UPDATE_PROGRESS); intent.putExtra(EXTRA_POSITION, currentValue); LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
LocalBroadcastManager
发送一个广播,因为我们希望这个广播对应用程序保密。 在您的 Activity 中:
// this is the broadcast receiver object that will handle our UI updates. private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int position = intent.getIntExtra(YourService.EXTRA_POSITION, 0); // do your UI updates here. } } @Override protected void onResume() { // register for the broadcast. LocalBroadcastManager.getInstance(this).registerReceiver( mReceiver, new IntentFilter(YourService.ACTION_UPDATE_PROGRESS)); super.onResume(); } @Override protected void onPause() { // unregister when activity is paused. LocalBroadcastManager.getInstance(PlayerActivity.this) .unregisterReceiver(mPlayerReceiver); super.onPause(); }
- 每当您需要更新 UI 时,请在您的服务中写入:
如果您发现任何不清楚的地方,请告诉我。
关于android - 当 android 终止后台任务时,AsyncTask postExecute 或 onCancelled 不会被调用 - 不再有后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11734360/