我的活动已经泄露窗口,我无法找到解决方案

时间:2014-10-30 02:54:40

标签: android window

以下是我的代码

    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:Activity 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)               at com.srg.ibc.appointmentapplication.CalendarView $ LoadAllProducts.onPreExecute(CalendarView.java:264)               在android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)               在android.os.AsyncTask.execute(AsyncTask.java:534)               at 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)               at 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(本地方法)

希望你能帮助我们。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您致电pDialog.dismiss();后,您的代码可能会尝试撤消进度对话框finish()

您可以将try catch块放在解雇程序周围。

答案 1 :(得分:0)

您在退出活动后尝试显示对话框。