2016-08-30 1 views
1

인스턴트 메신저를 사용하여 메모리 누수를 감지하고 그 아래의 잠정적 인 메모리 누수를 발견 할 수있는 아주 좋은 라이브러리라고해야합니다. 누수 보고서는 it.i가 생성하는 누수를 제거하는 방법을 찾을 수 없습니다. 이행.익명 구현 메모리 누수가 발생

GoProFragment이 누출 된 :

  • GC ROOT java.util.Timer $ TimerImpl.
  • 참조 MainActivity $ 5.이 $ 0 (0 java.util.TimerTask의 익명 서브 클래스)
  • 참조 MainActivity.mHelper
  • 참조 GoProFragment IabHelper.mPurchaseListener
  • 참조 $ 2.이 $ 0 (0 IabHelper $ OnIabPurchaseFinishedListener의 익명 구현)
  • GoProFragment 인스턴스
**GoProFragment.java** 
public class GoProFragment extends BaseFragment { 

    @Bind(R.id.btn_subscription_yearly) 
    Button btnsubScriptionYearly; 
    @Bind(R.id.btn_subscription_monthly) 
    Button monthly; 
    private ProgressDialog progressDialog; 
    String product_price_one, product_price_two, product_price_three; 
    @Bind(R.id.subscription_type) 
    TextView subScriptionType; 
    @Bind(R.id.graph_paid_feature) 
    ImageView imageView; 
    Bitmap icon; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.pro_layout, container, false); 
     ButterKnife.bind(this, view); 
     setHasOptionsMenu(true); 
     activity.preferences.setDisplayUpgrade(false); 
     icon = BitmapFactory.decodeResource(activity.getResources(), R.drawable.subscription_img_two); 
     imageView.setImageBitmap(icon); 
     subScriptionType.setText(activity.preferences.getSubscriptionType()); 
     String[] sku = { Util.SKU_CHALLENGE, Util.SKU_SUBSCRIPTION, Util.SKU_YEAR_SUBSCRIPTION}; 
     if(isNetworkAvailable(activity)) { 
      activity.mHelper.queryInventoryAsync(true, Arrays.asList(sku), mGotInventoryListener); 
      showProgressDialog(); 
     } 
     if (activity.preferences.isHasSubscription()) { 
      /*btnsubScriptionYearly.setVisibility(View.GONE); 
      monthly.setVisibility(View.GONE);*/ 
     } 
     return view; 
    } 
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
     @Override 
     public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
      dismissProgressDialog(); 
      product_price_one = inventory.getSkuDetails(Util.SKU_SUBSCRIPTION).getPrice(); 
      product_price_two = inventory.getSkuDetails(Util.SKU_YEAR_SUBSCRIPTION).getPrice(); 
      product_price_three = inventory.getSkuDetails(Util.SKU_CHALLENGE).getPrice(); 
      monthly.setVisibility(View.VISIBLE); 
      btnsubScriptionYearly.setVisibility(View.VISIBLE); 
      monthly.setText(activity.getString(R.string.monthly_subscription_text, product_price_one)); 
      btnsubScriptionYearly.setText(activity.getString(R.string.yearly_subscription_text, product_price_two)); 

     } 

    }; 

    @OnClick(R.id.btn_subscription_monthly) 
    public void onSubscription() { 
     if (Validator.isNotNull(activity.mHelper)) { 
      if (!activity.mHelper.subscriptionsSupported()) { 
       Util.showToast(activity, getString(R.string.subscription_not_supported)); 
       return; 
      } 
      if (!activity.mHelper.getAsyncInProgress()) { 
       activity.mHelper.launchPurchaseFlow(activity, 
         Util.SKU_SUBSCRIPTION, IabHelper.ITEM_TYPE_SUBS, 
         Util.RC_REQUEST, mPurchaseFinishedListener, Util.PAYLOAD); 
      } 
     } 
    } 

    @OnClick(R.id.btn_subscription_yearly) 
    public void onYearSubscription() { 
     if (Validator.isNotNull(activity.mHelper)) { 
      if (!activity.mHelper.subscriptionsSupported()) { 
       Util.showToast(activity, getString(R.string.subscription_not_supported)); 
       return; 
      } 
      if (!activity.mHelper.getAsyncInProgress()) { 
       activity.mHelper.launchPurchaseFlow(activity, 
         Util.SKU_YEAR_SUBSCRIPTION, IabHelper.ITEM_TYPE_SUBS, 
         Util.RC_REQUEST, mPurchaseFinishedListener, Util.PAYLOAD); 
      } 
     } 
    } 

    private boolean isNetworkAvailable(Context context) { 
     final ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
         return true; 
        } 
     } 

     return false; 
    } 
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
     public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 

      // if we were disposed of in the meantime, quit. 
      if (activity.mHelper == null) { 
       return; 
      } 

      if (result.isFailure()) { 
       return; 
      } 
      if (! Util.verifyDeveloperPayload(purchase)) { 
       return; 
      } 
      if (purchase.getSku().equals(Util.SKU_SUBSCRIPTION)) { 
       // bought the infinite gas subscription 
       setPremium(purchase, Calendar.MONTH); 
      } else if (purchase.getSku().equals(Util.SKU_YEAR_SUBSCRIPTION)) { 
       // bought the infinite gas subscription 
       setPremium(purchase, Calendar.YEAR); 
      } 
     } 
    }; 
    public void setPremium(Purchase purchase, int duration) { 
     if (Util.verifyDeveloperPayload(purchase)) { 
      activity.preferences.setHasSubscription(true); 
      if (Validator.isNotNull(activity.adView)) { 
       activity.adView.setVisibility(View.GONE); 
      } 
      Util.showToast(activity, getString(R.string.upgraded_successfully)); 
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTime(new Date(purchase.getPurchaseTime())); 
      calendar.add(duration, 1); 
      activity.preferences.getUserInfo().setSubscriptionEndOn(calendar.getTime()); 
      if(purchase.getSku().equals(Util.SKU_SUBSCRIPTION)) 
      { 
       activity.preferences.setSubscriptionType(activity.getResources().getString(R.string.monthly)); 
      } 
      else { 
       activity.preferences.setSubscriptionType(activity.getResources().getString(R.string.yearly)); 
      } 
      activity.preferences.getUserInfo().setPremium(true); 
      //subscriptionEndOn.setText(dateFormat.format(activity.preferences.getUserInfo().getSubscriptionEndOn())); 
     } 
    } 

    private void showProgressDialog() { 
     if (!activity.isFinishing() && progressDialog == null) { 
      progressDialog = new ProgressDialog(activity,R.style.CustomProgressDialog); 
      progressDialog.setCancelable(false); 
      progressDialog.show(); 

     } 

    } 

    /** 
    * dismiss Progress Dialog. 
    */ 
    private void dismissProgressDialog() { 
     if (!activity.isFinishing() && progressDialog != null && progressDialog.isShowing()) { 
      progressDialog.dismiss(); 
      progressDialog=null; 
     } 
    } 

    @Override 
    public void onDetach() { 
     if(Validator.isNotNull(icon)){ 
      icon.recycle(); 
     } 
     super.onDetach(); 
    } 
+0

귀하의 질문은 무엇입니까? –

+0

@ bub이 누설을 고치는 방법 –

답변

1

나는 그것이 문제라고 생각하지 않는다. Fragment에서 상태를 유지할 수 있지만 onCreate 콜백에서 setRetainInstance(true);으로 전화해야합니다.

this article

은 또한 당신이 onDetach 콜백의 필드 mGotInventoryListener = null;을 설정할 수 있습니다 참조하십시오.

+0

@ Adriaan Koster 나는 그것을 시도했지만 여전히 누출을주고있다. –

관련 문제