在Android Studio中的.hprof文件中,$符号代表什么?

3
在启动Gc并在Android Studio监视器中单击转储Java堆之后,将出现下面的图像:

enter image description here

“$”符号在类名DialogFrag后面的含义是什么?(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个回答

3

DialogFrag后面的$1是什么意思?

$数字表示匿名内部类,例如new View.OnClickListener() {...}

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

也许,你旋转了手机七次吗?

记得在适当的生命周期方法中注销监听器和BroadcastReceiver。尽量避免静态字段。


实际上,我循环七次以显示和关闭同一对话框片段的实例,我在其中有一个异步任务,这是否意味着可能会从异步任务中出现内存泄漏?尽管我在关闭对话框片段时取消了它并将其设置为null。 - has19
首先,不要在onCreateDialog中创建异步任务。这是一个UI回调,例如每次旋转手机时都会调用它。如果你真的只是想在这里“计算一些东西”,请使用除AsyncTask之外的其他工具,比如IntentService。然后使用事件总线将服务的结果发布到您的UI。 - Eugen Pechanec

1

带有$的类名表示您的内部类

命名规则为ClassName$InnerClassName

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

例如:ClassName$1

在您的情况下:

问题在于将您的AsyncTask定义为匿名类,如此处所示:asyncTask=new AsyncTask<Void, Void, Void>()...创建一个单独的类,并在需要时创建该类的实例。


但这是否意味着我有内存泄漏?我正在制作一个循环来显示和关闭对话框片段,每当我显示然后关闭相同的对话框片段时,内存分配就会增加,我已经添加了对话框片段代码,请检查。 - has19
问题在于您在此处将AsyncTask定义为匿名类,如asyncTask=new AsyncTask<Void, Void, Void>()...请创建一个单独的类,并在需要时创建该类的实例。 - Viral Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接