我的活动已泄漏窗口,我找不到解决方案
Posted
技术标签:
【中文标题】我的活动已泄漏窗口,我找不到解决方案【英文标题】:my activity has leaked window and I cant find solution 【发布时间】:2014-12-25 23:30:51 【问题描述】:以下是我的代码
public class CalendarView extends Activity
ArrayList<String> start_time,end_time;
String doctor_id , hospital_id,da_id,status,date,time_interval,appointment_type,no_of_patient,doctor_name,specialty,hospital_name;
public GregorianCalendar month, itemmonth;// calendar instances.
String temp_start,temp_end;
public CalendarAdapter adapter;// adapter instance
public Handler handler;// for grabbing some event values for showing the dot
// marker.
public ArrayList<String> items,items2; // container to store calendar items which
// needs showing the event marker
ProgressDialog pDialog;
JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> productsList;
private static String url_get_appointment = "http://pupqc.net/android_connect/get_appointments.php";
private static final String TAG_SUCCESS = "success";
private static final String TAG_APPOINTMENTS = "appointments";
private static final String TAG_DA_ID = "da_id";
private static final String TAG_STATUS = "status";
private static final String TAG_DATE = "date";
private static final String TAG_START_TIME = "start_time";
private static final String TAG_END_TIME = "end_time";
private static final String TAG_TIME_INTERVAL = "time_interval";
private static final String TAG_APPOINTMENT_TYPE = "appointment_type";
private static final String TAG_NO_OF_PATIENT = "no_of_patient";
private static final String TAG_DOCTOR_NAME = "doctor_name";
private static final String TAG_SPECIALTY = "specialty";
private static final String TAG_HOSPITAL_NAME = "hospital_name";
JSONArray products = null;
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.calendar);
Locale.setDefault( Locale.US );
month = (GregorianCalendar) GregorianCalendar.getInstance();
itemmonth = (GregorianCalendar) month.clone();
items = new ArrayList<String>();
items2 = new ArrayList<String>();
adapter = new CalendarAdapter(this, month);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(adapter);
handler = new Handler();
handler.post(calendarUpdater);
//Getting Information
doctor_id=getIntent().getStringExtra("TAG_DOCTOR");
hospital_id=getIntent().getStringExtra("TAG_HOSPITAL_ID");
productsList = new ArrayList<HashMap<String, String>>();
// Loading products in Background Thread
new LoadAllProducts().execute();
TextView title = (TextView) findViewById(R.id.title);
title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
RelativeLayout previous = (RelativeLayout) findViewById(R.id.previous);
previous.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
setPreviousMonth();
refreshCalendar();
);
RelativeLayout next = (RelativeLayout) findViewById(R.id.next);
next.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
setNextMonth();
refreshCalendar();
);
gridview.setOnItemClickListener(new OnItemClickListener()
public void onItemClick(AdapterView<?> parent, View v,
int position, long id)
((CalendarAdapter) parent.getAdapter()).setSelected(v);
String selectedGridDate = CalendarAdapter.dayString
.get(position);
String[] separatedTime = selectedGridDate.split("-");
String gridvalueString = separatedTime[2].replaceFirst("^0*",
"");// taking last part of date. ie; 2 from 2012-12-02.
int gridvalue = Integer.parseInt(gridvalueString);
// navigate to next or previous month on clicking offdays.
if ((gridvalue > 10) && (position < 8))
setPreviousMonth();
refreshCalendar();
else if ((gridvalue < 7) && (position > 28))
setNextMonth();
refreshCalendar();
((CalendarAdapter) parent.getAdapter()).setSelected(v);
pDialog.dismiss();
if(items2.contains(selectedGridDate))
Intent i = new Intent(getApplicationContext(),
requestconfirmation.class);
// Closing all previous activities
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("date",date);
i.putExtra("da_id",TAG_DA_ID);
i.putExtra("status",status);
i.putExtra("time_interval",time_interval);
i.putExtra("appointment_type",appointment_type);
i.putExtra("no_of_patient",no_of_patient);
i.putExtra("doctor_name",doctor_name);
i.putExtra("specialty",specialty);
i.putExtra("hospital_name",hospital_name);
i.putExtra("start_time",start_time);
i.putExtra("end_time",end_time);
startActivity(i);
else
showToast("No Appointment is set in this date.");
);
protected void setNextMonth()
if (month.get(GregorianCalendar.MONTH) == month
.getActualMaximum(GregorianCalendar.MONTH))
month.set((month.get(GregorianCalendar.YEAR) + 1),
month.getActualMinimum(GregorianCalendar.MONTH), 1);
else
month.set(GregorianCalendar.MONTH,
month.get(GregorianCalendar.MONTH) + 1);
protected void setPreviousMonth()
if (month.get(GregorianCalendar.MONTH) == month
.getActualMinimum(GregorianCalendar.MONTH))
month.set((month.get(GregorianCalendar.YEAR) - 1),
month.getActualMaximum(GregorianCalendar.MONTH), 1);
else
month.set(GregorianCalendar.MONTH,
month.get(GregorianCalendar.MONTH) - 1);
protected void showToast(String string)
Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
public void refreshCalendar()
TextView title = (TextView) findViewById(R.id.title);
adapter.refreshDays();
adapter.notifyDataSetChanged();
handler.post(calendarUpdater); // generate some calendar items
title.setText(android.text.format.DateFormat.format("MMMM yyyy", month));
public Runnable calendarUpdater = new Runnable()
@Override
public void run()
items.clear();
// Print dates of the current week
DateFormat df = new SimpleDateFormat("yyyy-MM-dd",Locale.US);
String itemvalue;
for (int i = 0; i < 7; i++)
itemvalue = df.format(itemmonth.getTime());
itemmonth.add(GregorianCalendar.DATE, 1);
adapter.setItems(items);
adapter.notifyDataSetChanged();
;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
// if result code 100
if (resultCode == 100)
// if result code 100 is received
// means user edited/deleted product
// reload this screen again
Intent intent = getIntent();
finish();
startActivity(intent);
/**
* Background Async Task to Load all product by making HTTP Request
* */
class LoadAllProducts extends AsyncTask<String, String, String>
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute()
super.onPreExecute();
pDialog = new ProgressDialog(CalendarView.this);
pDialog.setMessage("Loading Appointments. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
/**
* getting All products from url
* */
protected String doInBackground(String... args)
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("doctor_id", doctor_id));
params.add(new BasicNameValuePair("hospital_id", hospital_id));
// getting JSON string from URL
JSONObject json = jParser.makeHttpRequest(url_get_appointment, "POST", params);
// Check your log cat for JSON reponse
Log.d("All Appointments: ", json.toString());
try
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1)
// products found
// Getting Array of Products
products = json.getJSONArray(TAG_APPOINTMENTS);
items2.clear();
// looping through All Products
for (int i = 0; i < products.length(); i++)
JSONObject c = products.getJSONObject(i);
// Storing each json item in variable
date = c.getString(TAG_DATE);
da_id = c.getString(TAG_DA_ID);
status = c.getString(TAG_STATUS);
time_interval=c.getString(TAG_TIME_INTERVAL);
appointment_type=c.getString(TAG_APPOINTMENT_TYPE);
no_of_patient=c.getString(TAG_NO_OF_PATIENT);
doctor_name=c.getString(TAG_DOCTOR_NAME);
specialty=c.getString(TAG_SPECIALTY);
hospital_name=c.getString(TAG_HOSPITAL_NAME);
temp_start = c.getString(TAG_START_TIME);
temp_end = c.getString(TAG_END_TIME);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_DATE, date);
map.put(TAG_DA_ID, da_id);
map.put(TAG_STATUS, status);
start_time.add(temp_start);
end_time.add(temp_end);
items2.add(date);
// adding HashList to ArrayList
productsList.add(map);
else
// no products found
// Launch Add New product Activity
catch (JSONException e)
e.printStackTrace();
return null;
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url)
// dismiss the dialog after getting all products
pDialog.dismiss();
// updating UI from Background Thread
runOnUiThread(new Runnable()
public void run()
items.clear();
// Print dates of the current week
DateFormat df = new SimpleDateFormat("yyyy-MM-dd",Locale.US);
String itemvalue;
for (int i = 0; i < 7; i++)
itemvalue = df.format(itemmonth.getTime());
itemmonth.add(GregorianCalendar.DATE, 1);
adapter.setItems(items2);
adapter.notifyDataSetChanged();
);
这是错误
10-30 02:47:02.699 2195-2195/com.srg.ibc.appointmentapplication W/EGL_genymotion:eglSurfaceAttrib 未实现 10-30 02:47:03.075 2195-2195/com.srg.ibc.appointmentapplication E/WindowManager﹕活动 com.srg.ibc.appointmentapplication.CalendarView 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@最初添加在这里的 53698880 android.view.WindowLeaked: Activity com.srg.ibc.appointmentapplication.CalendarView 已经泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@53698880 在 android.view.ViewRootImpl.(ViewRootImpl.java:374) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 在 android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 在 android.view.Window$LocalWindowManager.addView(Window.java:547) 在 android.app.Dialog.show(Dialog.java:277) 在 com.srg.ibc.appointmentapplication.CalendarView$LoadAllProducts.onPreExecute(CalendarView.java:264) 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 在 android.os.AsyncTask.execute(AsyncTask.java:534) 在 com.srg.ibc.appointmentapplication.CalendarView.onCreate(CalendarView.java:100) 在 android.app.Activity.performCreate(Activity.java:5008) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 在 android.app.ActivityThread.access$600(ActivityThread.java:130) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:4745) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在 dalvik.system.NativeStart.main(Native Method)
希望你们能帮助我。提前致谢。
【问题讨论】:
只需搜索here 或谷歌。已经有很多信息了。 【参考方案1】:您试图在退出 Activity 后显示一个对话框。
【讨论】:
【参考方案2】:您的代码可能会在您调用finish()
后尝试关闭进度对话框pDialog.dismiss();
。
您可以将 try catch
块放在该解雇程序周围。
【讨论】:
以上是关于我的活动已泄漏窗口,我找不到解决方案的主要内容,如果未能解决你的问题,请参考以下文章
[Android活动已泄漏com.android.internal.policy.impl.phonewindow $ decorview问题窗口