0

코드 실행 중에 아래 오류가 나타납니다. 나는 누출 된 기억을 멈추고이 문제를 없애는 방법을 모른다.안드로이드에서 코드 조각을 내보내는 동안 메모리 누수 문제가 발생했습니다.

08-30 10:00:32.538: E/WindowManager(851): Activity simplicity.in.TenderPopUpTabsActivity has leaked window [email protected] that was originally added here 
08-30 10:00:32.538: E/WindowManager(851): android.view.WindowLeaked: Activity simplicity.in.TenderPopUpTabsActivity has leaked window [email protected] that was originally added here 
08-30 10:00:32.538: E/WindowManager(851): at android.view.ViewRoot.<init>(ViewRoot.java:247) 
08-30 10:00:32.538: E/WindowManager(851): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
08-30 10:00:32.538: E/WindowManager(851): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
08-30 10:00:32.538: E/WindowManager(851): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
08-30 10:00:32.538: E/WindowManager(851): at android.app.Dialog.show(Dialog.java:241) 
08-30 10:00:32.538: E/WindowManager(851): at android.app.ProgressDialog.show(ProgressDialog.java:107) 
08-30 10:00:32.538: E/WindowManager(851): at android.app.ProgressDialog.show(ProgressDialog.java:90) 
08-30 10:00:32.538: E/WindowManager(851): at simplicity.in.PaymentActivity.transByPaymentGateway(PaymentActivity.java:263) 
08-30 10:00:32.538: E/WindowManager(851): at simplicity.in.PaymentActivity.onClick(PaymentActivity.java:131) 
08-30 10:00:32.538: E/WindowManager(851): at android.view.View.performClick(View.java:2408) 
08-30 10:00:32.538: E/WindowManager(851): at android.view.View$PerformClick.run(View.java:8816) 
08-30 10:00:32.538: E/WindowManager(851): at android.os.Handler.handleCallback(Handler.java:587) 
08-30 10:00:32.538: E/WindowManager(851): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-30 10:00:32.538: E/WindowManager(851): at android.os.Looper.loop(Looper.java:123) 
08-30 10:00:32.538: E/WindowManager(851): at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-30 10:00:32.538: E/WindowManager(851): at java.lang.reflect.Method.invokeNative(Native Method) 
08-30 10:00:32.538: E/WindowManager(851): at java.lang.reflect.Method.invoke(Method.java:521) 
08-30 10:00:32.538: E/WindowManager(851): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-30 10:00:32.538: E/WindowManager(851): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-30 10:00:32.538: E/WindowManager(851): at dalvik.system.NativeStart.main(Native Method) 

메모리 누수 문제가있는 곳에서는 아래 코드를 사용하고 있습니다. 나는이 방법을 실행하면 그 문제는 나에게이 문제를 당신이 백그라운드 스레드에서 마무리()를 호출하려고하기 때문입니다

답변

3

나는 그것이 context 때문에 당신이 당신의 progress dialog에 사용되는 생각합니다. progress dialog 초기화에서 getBaseContext() 또는 getApplicationContext()을 시도해보십시오.

대신

dialog = ProgressDialog.show(PaymentActivity.this, "", "Processing Transaction...", true); 

의 시도

dialog = ProgressDialog.show(getApplicationContext(), "", "Processing Transaction...", true); 

또는

dialog = ProgressDialog.show(getBaseContext(), "", "Processing Transaction...", true); 

또한 귀하의 활동을 완료하기 전에

dialog.dismiss(); 

을 완료하기 전에 수행하십시오.

+0

가 로그 캣 에 오류 메시지가 아래에 제공 getApplicationContext()와 getBaseContext()와 함께 일하지 않았나요

new UpdateInfoAsyncTask(YourActivity.this,10,"hi").execute(); 
11월 8일에서 30일까지 : 26 : 37.982 : E/AndroidRuntime (317) : android.view.WindowManager $ BadTokenException : 창을 추가 할 수 없습니다 - 애플리케이션의 토큰 null이 아닙니다. 08-30 11 : 26 : 37.982 : E/AndroidRuntime (317) : \t android.view.ViewRoot.setView (ViewRoot.java:509) 08-30 11 : 26 : 37.982 : E/AndroidRuntime (317) : \t android.view .WindowManagerImpl.addView (WindowManagerImpl.java : 177) 08-30 11 : 26 : 37.982 : android.view.WindowManagerImpl.addView (WindowManagerImpl.java:91) –

+2

의 E/AndroidRuntime (317) : \t에서 활동을 마치기 전에 진행 대화 상자를 닫으십시오. –

+0

네, 잘 했어. 이제 더 많은 테스트를하고 있습니다. –

1

를 해결하는 가장 좋은 방법을 안내하시기 바랍니다

private void transByPaymentGateway(final double ccAmt) { 
     dialog = ProgressDialog.show(PaymentActivity.this, "", "Processing Transaction...", true); 
     new Thread(new Runnable() { 
      public void run() { 
       boolean successful = false; 
       final String totalAmt; 
       if(ccAmt <25){ 
        totalAmt = Double.toString(amount); 
        AnyPayment anyPayment = new AnyPayment(PaymentActivity.this); 
        successful = anyPayment.payAmount(Name, Number,totalAmt); 
       } 
       } 
       if(successful){ 
        runOnUiThread(new Runnable() { 
         public void run() { 
          showApprovalToast(); 
          Variables.creditCardAmount = amount; 
          getReceiptfromPrinter(); 
          saveTransactioDetails(); 

          if(Variables.customerEmailId.equals("")){ 
           System.out.println("Customer is Not associated"); 
          } 
          else{ 
           System.out.println("Testing email"+Variables.customerEmailId); 
           System.out.println("Testing"+Variables.customerId); 
           FacebookSharingUtils facebookSharingUtils = new FacebookSharingUtils(PaymentActivity.this); 
           facebookSharingUtils.execute(); 
          } 

         } 
        }); 
        finish(); 
       } 
       else{ 
        runOnUiThread(new Runnable() { 
         public void run() { 
          showCcSwipeMessage(); 
          infoOnSwipeEditText.setText(""); 
          dialog.dismiss(); 
         } 
        }); 
       } 
      } 
     }).start(); 
    } 

발생했습니다.

runOnUIThread() 메소드에서 finish()를 put하십시오.

runOnUiThread(new Runnable() { 
         public void run() { 
          showApprovalToast(); 
          Variables.creditCardAmount = amount; 
          getReceiptfromPrinter(); 
          saveTransactioDetails(); 

          if(Variables.customerEmailId.equals("")){ 
           System.out.println("Customer is Not associated"); 
          } 
          else{ 
           System.out.println("Testing email"+Variables.customerEmailId); 
           System.out.println("Testing"+Variables.customerId); 
           FacebookSharingUtils facebookSharingUtils = new FacebookSharingUtils(PaymentActivity.this); 
           facebookSharingUtils.execute(); 
          } 
          finish(); 

         } 
        }); 
2

대화 상자가 표시되었습니다. 활동이 끝나기 전에 그것을 닫으십시오. 당신이 그것을 닫지 않았으므로, 창 오류가오고있다. 이 같은

Soething :

@Override 
public void OnDestory() { 
    if (dialog != null) { 
     dialog.dismiss(); 
     dialog = null; 
    } 
} 
2

스레드를 사용하는 대신 Android는 AsyncTask을 사용하는 것이 좋습니다.이 스레드는 스레드가 수행 할 수없는 UI 스레드에서도 응답을 처리합니다.

AsyncTask를 사용하여 코드를 수정했습니다. 그것을 구현하십시오.

public class UpdateInfoAsyncTask extends AsyncTask<Void, Void, Boolean> { 
    int intValue; 
    String strValue; 

    ProgressDialog dialog; 
    Context context; 

    public UpdateInfoAsyncTask(Context context,int intValue, String strValue) { 
     this.context = context; 
     this.intValue = intValue; 
     this.strValue = strValue; 
    } 

    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(context, "Dialog Title", 
       "Dialog message"); 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     // use intValue 
     // use strValue 
     // do your web service call or other stuff 
     if(successful) 
      return true; 
     else 
      return false; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if (dialog != null) 
      dialog.dismiss(); 
     // do some UI operation here which you have done in "runOnUiThread" 
    } 
} 

이를 사용하려면,