2016-07-28 72 views
1

启动GC和点击机器人工作室监视器转储Java堆后,这一形象出现下面

enter image description here

什么是$旁边类DialogFrag就像在DialogFrag $ 1中意味着什么? (DialogFrag只是一个扩展Dialogfragment的类) 我想只有这个类的一个实例,但正如你可以在DialogFrag $ 1旁看到的那样,总数是7,这是否意味着我有内存泄漏?

编辑:这是我的对话片段类

public class DialogFrag extends DialogFragment { 
    AsyncTask<Void,Void,Void> asyncTask; 


     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 


AlertDialog.Builder alertdialog=new AlertDialog.Builder(getActivity()); 


      alertdialog.setTitle("Solution:"); 

      View view = getActivity().getLayoutInflater().inflate(R.layout.dialogfrag,null); 

      final MyView myview= (MyView) view.findViewById(R.id.myview); 
      myview.setVisibility(View.INVISIBLE); 

    alertdialog.setView(view); 

    asyncTask=new AsyncTask<Void, Void, Void>() { 
       @Override 
       protected void doInBackground(Void... voids) { 
        //compute something here 

       } 

       @Override 
       protected void onPostExecute(Void param) { 
        super.onPostExecute(param); 

             getDialog().findViewById(R.id.progress).setVisibility(View.GONE); 
        myview.setVisibility(View.VISIBLE); 
       } 
      }); 


      asyncTask.execute(); 





      alertdialog.setPositiveButton("SHOW", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 


        if(!(asyncTask.getStatus()== AsyncTask.Status.FINISHED)){ 
         asyncTask.cancel(true); 
        } 

        asyncTask=null; 


        dismiss(); 
       } 
      }); 



      alertdialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 

        if(!(asyncTask.getStatus()== AsyncTask.Status.FINISHED)){ 
         asyncTask.cancel(true); 
        } 

        asyncTask=null; 
        dismiss(); 
       } 
      }); 


      Dialog dialog=alertdialog.create(); 
      dialog.getWindow().getAttributes().windowAnimations = R.style.MyDialogViewAnimation; 

      return dialog; 
     } 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      getDialog().getWindow().setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP); 
      getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 
      return super.onCreateView(inflater, container, savedInstanceState); 
     } 

回答

2

DialogFrag类似于DialogFrag $ 1中类DialogFrag的$ next意味着什么?

$number表示匿名内部类,示例将是new View.OnClickListener() {...}

但正如你可以看到旁边的DialogFrag $ 1总数为7,这是否意味着我有内存泄漏?

也许,您是否旋转了手机七次?

请记住在合适的生命周期方法中取消注册听众和BroadcastReceiver。尽量避免静态字段。

+0

其实我循环七次显示和对话片段的同一个实例解雇,我有一个异步任务里,这是否意味着从它的AsyncTask可能的内存泄漏?虽然我取消它,将其设置为null每当我驳回dialogfragment – has19

+0

我有添加对话框FRAG代码,如果你可以检查 – has19

+0

首先,不要创建'onCreateDialog'异步任务。这是一个UI回调,它被调用,例如每次你旋转手机。如果你真的只是“在这里计算某些东西”,可以使用除“AsyncTask”之外的其他工具,也许是['IntentService'](https://developer.android)。COM /培训/运行后台服务/创建-service.html)。然后使用[事件总线](https://github.com/greenrobot/EventBus)将服务结果发布到您的用户界面。 –

0

$类名代表你内部类

的命名是ClassName$InnerClassName

当你看到数字而不是实际的名称创建它们在你的方法创建匿名内部类。

E.g. ClassName$1

你的情况:

问题是你的AsyncTask匿名类在这里asyncTask=new AsyncTask<Void, Void, Void>()的定义......创建一个单独的类,并在需要时创建类的实例。

+0

但这是否意味着我有内存泄漏?我正在做一个循环来显示和解散一个对话框片段,并且内存分配不断增加,无论何时我显示并且忽略相同的对话框片段,如果您可以检查plz – has19

+0

问题,我添加了对话框代码问题是您的AsyncTask作为匿名class async asyncTask = new AsyncTask ()'...创建一个单独的类并在需要时创建该类的实例。 – AndroidMechanic