代码之家  ›  专栏  ›  技术社区  ›  Donal Rafferty

异步任务在运行状态下有时不运行?

  •  0
  • Donal Rafferty  · 技术社区  · 14 年前

    在应用程序中,我在启动活动时使用AsyncTask来获取特定联系人的铃声。

    它正常工作,但我注意到,如果在AsyncTask到达doinBackground方法之前应用程序停止了两次,那么当活动再次启动时,AsyncTask无法正常运行,只会到达onPreExecute()方法。

    这是我的代码:

    异步任务本身:


    private class SelectRingtoneTask extends AsyncTask<String, Void, Void> {
    
              // can use UI thread here   
              protected void onPreExecute() {
                  Log.d("cda", "Into selectRingToneTask - onPreExecute() - " + selectRingtoneFinished);
              }
    
              // automatically done on worker thread (separate from UI thread)
              protected Void doInBackground(final String... args) {
                  Log.d("cda", "Into selectRingToneTask - !!!!!!!!!!!!!!!");
                 getRingTone();
                 return null;
              }
    
              // can use UI thread here
              protected void onPostExecute(final Void unused) {
               selectRingtoneFinished = true;
               Log.d("cda", "Into selectRingToneTask - onPostExecute - " + selectRingtoneFinished);
              }
           }
    

    启动时调用AsyncTask的位置:


    if(srtt == null){
    srtt = new SelectRingtoneTask();
    Log.d("cda", "RingTone - " + srtt.getStatus());
    }
    srtt.execute();
    

    问题发生在我在AsyncTask完成之前启动活动并关闭活动时,如果这发生一次,似乎没问题,但在第二次发生之后,AsyncTask将只访问onPreExecute()方法,并且在强制停止并重新启动应用程序之前永远不会再次完成。

    有人知道为什么会发生这种事吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Pentium10    14 年前

    你需要 cancel 当您的活动被破坏时,在AsyncTask的方法中检查 isCancelled 在尝试处理提取的结果之前标记。

    我强烈建议您阅读 Shelves 了解如何在配置更改之间保持任务,以及在活动被破坏时如何正确取消任务。

        2
  •  0
  •   Marcin Waśniowski    13 年前
        if(srtt == null){    <--- Not needed
            srtt = new SelectRingtoneTask();
            Log.d("cda", "RingTone - " + srtt.getStatus());
        }
        srtt.execute();
    

    我不知道你近距离接触到什么,但我对线也有类似的问题。 在我看来,这里的问题是,当你不被允许的时候,你第二次发射同样的活动任务。要在关闭活动时解决问题,请取消线程并确保将SRTT设置为空。希望这有帮助