android - 当 android 终止后台任务时,AsyncTask postExecute 或 onCancelled 不会被调用 - 不再有后台进程

标签 android android-asynctask

我正在运行一个队列,我正在下载视频并使队列正常工作,需要强制调用 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 不是系统组件(服务是)。

更新:

  1. 使用您自己的实现扩展 IntentService
  2. 要更新 UI,您可以使用广播。如下:

    1. 每当您需要更新 UI 时,请在您的服务中写入:
      
      Intent intent = new Intent(ACTION_UPDATE_PROGRESS);
      intent.putExtra(EXTRA_POSITION, currentValue);
      LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
      
      在这里,我们使用 LocalBroadcastManager 发送一个广播,因为我们希望这个广播对应用程序保密。
    2. 在您的 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();
      }
      

如果您发现任何不清楚的地方,请告诉我。

关于android - 当 android 终止后台任务时,AsyncTask postExecute 或 onCancelled 不会被调用 - 不再有后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11734360/

相关文章:

java - 如何从 Android 上的异步任务返回图像

Android Build with Kotlin DSL - 如何访问 flavor 额外属性?

java - 单击 : update content of expandable ListView

javascript - Android + PhoneGap + 包管理器

java - 多项和单项选择测试

android - onCreateLoader 返回的对象不能是非静态内部成员类 : DumbLoader

android - 如何在 asynctask android 中恢复下载

java - 将 AsyncTask 从类中调用到 MainActivity 中

java - 为什么 if 条件在 AyncTasks 的 onPostExecute() 中完全无用?

java - Android:将 XML android:background 转换为 Java 程序代码