2017-01-11 8 views
0

私はAsyncTaskにWindowLeaksを持っていて、それに対処する方法がわかりません。onPostExecutedismiss()を入れてみましたが、それでも私には同じ問題があります。AsyncTaskでWindowLeaked

protected void onPreExecute() { 
    if(this.showLoadingMessage) { 
     this.progressDialog = new ProgressDialog(this.context); 
     this.progressDialog.setMessage(this.loadingMessage); 
     this.progressDialog.show(); 
     this.progressDialog.setCancelable(false); 
    } 
    super.onPreExecute(); 
} 
protected void onPostExecute(String result) { 
    if(this.showLoadingMessage && this.progressDialog.isShowing()) { 
     this.progressDialog.dismiss(); 
    } 

    result = result.trim(); 
    if(this.asyncResponse != null) { 
     this.asyncResponse.processFinish(result); 
    } 

    if(this.exception != null) { 
     if(this.exceptionHandler != null) { 
      this.exceptionHandler.handleException(this.exception); 
     } 

     if(this.eachExceptionsHandler != null) { 
      Log.d(this.LOG, "" + this.exception.getClass().getSimpleName()); 
      if(this.exception instanceof MalformedURLException) { 
       this.eachExceptionsHandler.handleMalformedURLException((MalformedURLException)this.exception); 
      } else if(this.exception instanceof ProtocolException) { 
       this.eachExceptionsHandler.handleProtocolException((ProtocolException)this.exception); 
      } else if(this.exception instanceof UnsupportedEncodingException) { 
       this.eachExceptionsHandler.handleUnsupportedEncodingException((UnsupportedEncodingException)this.exception); 
      } else if(this.exception instanceof IOException) { 
       this.eachExceptionsHandler.handleIOException((IOException)this.exception); 
      } 
     } 
    } 

} 

このコードが動作しているときにこのリークが発生します。

         HashMap postNotification = new HashMap(); 

            postNotification.put("txtOwner", tvRenter.getText().toString()); 

            AsyncClass taskCount = new AsyncClass(ownerAccept.this, postNotification, new AsyncResponse() { 
             @Override 
             public void processFinish(String s) { 
              if(s.contains("success")){ 
               HashMap postNotif = new HashMap(); 

               postNotif.put("txtOwner", tvRenter.getText().toString()); 

               AsyncClass taskAdd = new AsyncClass(ownerAccept.this, postNotif, new AsyncResponse() { 
                @Override 
                public void processFinish(String s) { 
                 if(s.contains("success")){ 
                  Log.d(TAG, s); 
                  Intent in = new Intent(ownerAccept.this, RenterTabs.class); 
                  startActivity(in); 
                  finish(); 
                 } 
                } 
               }); 
                taskAdd.execute("http://carkila.esy.es/carkila/notificationAccept.php"); 
              } else { 
               Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show(); 
              } 
             } 
            }); 
            taskCount.execute("http://carkila.esy.es/carkila/notificationCount.php"); 
           } 
          }) 
          .setNegativeButton("No", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            dialog.cancel(); 
           } 
          }); 
        AlertDialog alert = a_accept.create(); 
        alert.setTitle("Accept"); 
        alert.show(); 
+0

ここからの 'context'はどこですか? 'コンテキスト'を提供する 'Activity'を終了したら、あなたはリークで終わるでしょう。 – Pztar

+0

'LogCat'を投稿できますか?古いものを解読せずにアクティビティを終了することなく、新しい 'Dialog'を表示しているので、あなたの問題の原因と思われる最初のコールバックで新しいタスクを実行しているようです。 – Pztar

答えて

0

いつこれらのリークがありますか? AsyncTaskを起動したアクティビティ(またはフラグメント)が破棄された場合、これらのリークが発生することに注意してください。

+0

漏洩した活動を追加しました。 – JosephG

+0

これは、AsyncTasksをIntentServicesに移行することで回避できます。 AsyncTaskは、メモリの問題やその他の理由で破棄された場合、WindowLeaksを取得するために、アクティビティやフラグメントを使用します。 Androidのサービスガイド(https://developer.android.com/guide/components/services.html)を読むことをお勧めします。それはより多くのコードを書くことですが、最後には報われます。 –

+0

+ JosephGあなたは完全なスタックトレースを表示することができます、問題はあなたのダイアログを提示している方法かもしれません。 –