0
我不確定是哪一個導致內存泄漏,所以根據logCat我打印了我的代碼,請幫助我在這裏做什麼錯誤?RunonUiThread()或CustomListAdapter導致內存泄漏?
public class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
// private Context context;
ArrayList<String> data;
int pos;
public EfficientAdapter(Context context,ArrayList<String> received) {
mInflater = LayoutInflater.from(context);
//this.context = context;
data = received;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.list_cities, null);
holder = new ViewHolder();
holder.textLine = (TextView) convertView.findViewById(R.id.lblCity);
convertView.setTag(holder);
}else
{
holder = (ViewHolder)convertView.getTag();
}
convertView.setOnClickListener(new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
myInterface.search(getItem(position));
SearchCity.this.dismiss();
}
});
holder.textLine.setText(getItem(position));
return convertView;
}
class ViewHolder {
TextView textLine;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getCount() {
return data.size();
}
@Override
public String getItem(int position) {
return data.get(position);
}
}
堆棧跟蹤:
05-18 19:08:57.682: ERROR/WindowManager(314): Activity com.FindMe.DisplayAtms has leaked window [email protected] that was originally added here
05-18 19:08:57.682: ERROR/WindowManager(314): android.view.WindowLeaked: Activity com.FindMe.DisplayAtms has leaked window [email protected] that was originally added here
05-18 19:08:57.682: ERROR/WindowManager(314): at android.view.ViewRoot.<init>(ViewRoot.java:247)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.app.Dialog.show(Dialog.java:241)
05-18 19:08:57.682: ERROR/WindowManager(314): at com.FindMe.DisplayAtms$1.run(DisplayAtms.java:269)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.app.Activity.runOnUiThread(Activity.java:3707)
05-18 19:08:57.682: ERROR/WindowManager(314): at com.FindMe.DisplayAtms$AsycLoaderFromDbAndMapInjector.onPreExecute(DisplayAtms.java:880)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-18 19:08:57.682: ERROR/WindowManager(314): at com.FindMe.DisplayAtms.LoadFunction(DisplayAtms.java:145)
05-18 19:08:57.682: ERROR/WindowManager(314): at com.FindMe.DisplayAtms$7.search(DisplayAtms.java:513)
05-18 19:08:57.682: ERROR/WindowManager(314): at com.FindMe.SearchCity$EfficientAdapter$1.onClick(SearchCity.java:152)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.view.View.performClick(View.java:2408)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.view.View$PerformClick.run(View.java:8816)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.os.Handler.handleCallback(Handler.java:587)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.os.Handler.dispatchMessage(Handler.java:92)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.os.Looper.loop(Looper.java:123)
05-18 19:08:57.682: ERROR/WindowManager(314): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-18 19:08:57.682: ERROR/WindowManager(314): at java.lang.reflect.Method.invokeNative(Native Method)
05-18 19:08:57.682: ERROR/WindowManager(314): at java.lang.reflect.Method.invoke(Method.java:521)
05-18 19:08:57.682: ERROR/WindowManager(314): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-18 19:08:57.682: ERROR/WindowManager(314): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-18 19:08:57.682: ERROR/WindowManager(314): at dalvik.system.NativeStart.main(Native Method)
的AsyncTask:
public class Asyctast extends AsyncTask<Void, Object, Void>
{
private ProgressDialog dialog = new ProgressDialog(DisplayAtms.this);
@Override
protected void onPreExecute() {
super.onPreExecute();
runOnUiThread(showProgress);
}
@Override
protected void onProgressUpdate(final Object... args) {
super.onProgressUpdate(args);
if ((Boolean) args[0]) {
Toast.makeText(DisplayAtms.this, args[1].toString(),
Toast.LENGTH_LONG).show();
}
}
@Override
protected Void doInBackground(Void... arg0) {
Log.d("Asynctask", ""+arg0);
publishProgress(true,"sd sdfsdf");
return null;
}
@Override
protected void onPostExecute(Boolean result) {
runOnUiThread(hideProgress);
}
}
Runnable showProgress = new Runnable() {
@Override
public void run() {
pd = new ProgressDialog(DisplayAtms.this);
pd = registerDialog(pd);
pd.show();
}
};
Runnable hideProgress = new Runnable() {
@Override
public void run() {
if(pd != null)
pd.hide();
}
};
轉儲HPROF文件,並使用MAT更準確地檢測內存泄漏。 – CommonsWare 2011-05-18 14:42:51
可否請您進一步指導?我不知道這些工具。 – UMAR 2011-05-19 07:47:43
http://www.youtube.com/watch?v=_CruQY55HOk – CommonsWare 2011-05-19 10:21:17