启动Gc并在android studio monitor中单击dump java heap后,将显示以下图片:
在DialogFrag $ 1中,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);
}
答案 0 :(得分:3)
在DialogFrag $ 1中,DialogFrag类旁边的$是什么意思?
$number
表示匿名内部类,例如new View.OnClickListener() {...}
。
但正如你在DialogFrag $ 1旁边看到的那样,总数是7,这是否意味着我有内存泄漏?
也许,你有七次旋转手机吗?
请记住在适当的生命周期方法中取消注册侦听器和BroadcastReceiver
。尽量避免使用静态字段。
答案 1 :(得分:1)
带有$
的班级名称代表内部班级。
命名法是ClassName$InnerClassName
当您看到数字而不是实际名称时,它们是在您的方法中创建的匿名内部类。
E.g。 ClassName$1
在您的情况下:
问题是将AsyncTask定义为匿名类asyncTask=new AsyncTask<Void, Void, Void>()
...创建一个单独的类并在需要时创建该类的实例。