仍然坚持JSON解析问题

时间:2013-01-01 06:00:59

标签: java android

我陷入困境并疯狂地解决了这个问题,但我没有运气。我尝试过SO成员给我的所有指导方针,因为我之前曾问过这个问题:(感谢所有回复的人。我搜索了很多但是没有成功最后的希望就是这样,所以请指导我哪里出错了怎么样我可以解决这个JSONParsing吗?我发布了PHP的数据并希望在Android的EditText框中获取它。我编码但是从第一天开始存在一些问题但尚未解决。我在模拟器和电话上遇到了不同的LogCat错误我已经向你提出了我的java代码和LogCat错误。任何指南对我来说都很珍贵。

我的Java代码是我遇到错误的地方:

// save button
    btnSave = (Button) findViewById(R.id.btnSave);

    // getting product details from intent
    Intent i = getIntent();

    // getting product id (pid) from intent
    cid = i.getStringExtra(TAG_CID);

    // save button click event
    btnSave.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // starting background task to update product
            new SaveTaskDetails().execute();
        }
    });

    }

@Override
protected void onStart() {
  super.onStart();
   // Getting complete product details in background thread
  new GetTaskDetails().execute();
}

/**
 * Background Async Task to Get complete product details
 * */
class GetTaskDetails extends AsyncTask<String, String, JSONObject> {

    /**
     * Before starting background thread Show Progress Dialog
     * */


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        tDialog = new ProgressDialog(My_Task.this);
        tDialog.setTitle("Please Wait");
        tDialog.setMessage("Retrieving Task Details.");
        tDialog.setIndeterminate(false);
        tDialog.setCancelable(true);
        tDialog.show();

    }

    /**
     * Getting task details in background thread
     * @return 
     **/

   protected JSONObject doInBackground(String... params1) {

      JSONObject my_task = null;
           // updating UI from Background Thread
                  // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("cid", cid));

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = JSONParser.makeHttpRequest(
                            url_read_mytask, "GET", params);

                    // check your log for json response
     //                Log.d("Single Task Details", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received product details
                        JSONArray my_taskObj = json
                                .getJSONArray(TAG_MYTASK); // JSON Array

                        // get first product object from JSON Array
                       my_task = my_taskObj.getJSONObject(0);

                         }
                    else
                    {
                        // task with cid not found

                    }
                } 
                catch (JSONException e) {
                    e.printStackTrace();
                }


        return my_task;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/


    protected void onPostExecute(JSONObject my_task) {
        // dismiss the dialog once got all details
        cus_name_txtbx = (EditText) findViewById(R.id.cus_name_txtbx);
        try {
            cus_name_txtbx.setText(my_task.getString(TAG_NAME));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        contact_no_txtbx = (EditText) findViewById(R.id.contact_no_txtbx);
        try {
            contact_no_txtbx.setText(my_task.getString(TAG_CONTACT));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ticket_no_txtbx = (EditText) findViewById(R.id.ticket_no_txtbx);
        try {
            ticket_no_txtbx.setText(my_task.getString(TAG_TICKET));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        task_detail_txtbx = (EditText) findViewById(R.id.task_detail_txtbx);
        try {
            task_detail_txtbx.setText(my_task.getString(TAG_TASKDETAIL));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }           

        tDialog.dismiss(); 
    }
}

/**
 * Background Async Task to  Save product Details
 * */
class SaveTaskDetails extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        tDialog = new ProgressDialog(My_Task.this);
        tDialog.setTitle("Please Wait");
        tDialog.setMessage("Saving Task");
        tDialog.setIndeterminate(false);
        tDialog.setCancelable(true);
        tDialog.show();
    }

    /**
     * Saving product
     * */
    protected String doInBackground(String... args) {

        // getting updated data from EditTexts
        String cus_name = cus_name_txtbx.getText().toString();
        String contact_no = contact_no_txtbx.getText().toString();
        String ticket_no = ticket_no_txtbx.getText().toString();
        String task_detail = task_detail_txtbx.getText().toString();

        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair(TAG_CID, cid));
        params.add(new BasicNameValuePair(TAG_NAME, cus_name));
        params.add(new BasicNameValuePair(TAG_CONTACT, contact_no));
        params.add(new BasicNameValuePair(TAG_TICKET, ticket_no));
        params.add(new BasicNameValuePair(TAG_TASKDETAIL, task_detail));

        // sending modified data through http request
        // Notice that update product url accepts POST method
        JSONObject json = JSONParser.makeHttpRequest(url_update_mytask,
                "POST", params);

        // check json success tag
        try {
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // successfully updated
                Intent i = getIntent();
                // send result code 100 to notify about product update
                setResult(100, i);
                finish();
            } else {
                // failed to update product
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once product uupdated
        tDialog.dismiss();
    }
}

我的Logcat错误是:

    01-01 11:28:52.549: E/WindowManager(31782):     at java.lang.reflect.Method.invokeNative(Native Method)
01-01 11:38:15.149: E/WindowManager(1133): Activity com.example.visit.record.My_Task has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4054ce88 that was originally added here
01-01 11:38:15.149: E/WindowManager(1133): android.view.WindowLeaked: Activity com.example.visit.record.My_Task has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4054ce88 that was originally added here
01-01 11:38:15.149: E/WindowManager(1133):  at android.view.ViewRoot.<init>(ViewRoot.java:277)
01-01 11:38:15.149: E/WindowManager(1133):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
01-01 11:38:15.149: E/WindowManager(1133):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
01-01 11:38:15.149: E/WindowManager(1133):  at android.view.Window$LocalWindowManager.addView(Window.java:433)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.Dialog.show(Dialog.java:288)
01-01 11:38:15.149: E/WindowManager(1133):  at com.example.visit.record.My_Task$GetTaskDetails.onPreExecute(My_Task.java:139)
01-01 11:38:15.149: E/WindowManager(1133):  at android.os.AsyncTask.execute(AsyncTask.java:391)
01-01 11:38:15.149: E/WindowManager(1133):  at com.example.visit.record.My_Task.onStart(My_Task.java:118)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1225)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.Activity.performStart(Activity.java:3941)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1794)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1842)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.ActivityThread.access$1500(ActivityThread.java:132)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
01-01 11:38:15.149: E/WindowManager(1133):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-01 11:38:15.149: E/WindowManager(1133):  at android.os.Looper.loop(Looper.java:143)
01-01 11:38:15.149: E/WindowManager(1133):  at android.app.ActivityThread.main(ActivityThread.java:4268)
01-01 11:38:15.149: E/WindowManager(1133):  at java.lang.reflect.Method.invokeNative(Native Method)
01-01 11:38:15.149: E/WindowManager(1133):  at java.lang.reflect.Method.invoke(Method.java:507)
01-01 11:38:15.149: E/WindowManager(1133):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-01 11:38:15.149: E/WindowManager(1133):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-01 11:38:15.149: E/WindowManager(1133):  at dalvik.system.NativeStart.main(Native Method)

请指导。 我在新GetTaskDetails()。execute(); 和Get **tDialog.show();**上的GetTaskDetails类的PreExecute上出现错误

2 个答案:

答案 0 :(得分:0)

解决方法是在您创建的Dialog上调用dismiss() 在退出活动之前viewP.java:183,例如在onPause()。

视图引用了它们的父Context(取自构造函数参数)。如果您在不破坏Dialogs和其他动态创建的视图的情况下离开活动,他们仍会保留对您的活动的引用(如果您使用此作为 上下文:与新ProgressDialog(this)一样,

因此,GC无法收集它,导致内存泄漏。

答案 1 :(得分:0)

  

你在后台运行你的UI从他们中移除并在post中执行你   可以设置(例如,逗号_txtbx.setText(my_task.getString(TAG_NAME));)你   没有在doIn中将它们设置为每个UI进入doIn ..