0

I am trying to get the data from phpMyAdmin using JSON with php. I am using Android Studio. I have tried to use Progress Dialog, then windows leaked (already use p.Dialog.dismiss()). After that, I have remove Progress Dialog then new exception occur. Is there any other solution to solve this problem?

This is my logcat.

 java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:299)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
            at java.util.concurrent.FutureTask.run(FutureTask.java:239)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:838)
     Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
            at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5351)
            at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:970)
            at android.view.View.requestLayout(View.java:15722)
            at android.view.View.requestLayout(View.java:15722)
            at android.view.View.requestLayout(View.java:15722)
            at android.view.View.requestLayout(View.java:15722)
            at android.view.View.requestLayout(View.java:15722)
            at android.view.View.requestLayout(View.java:15722)
            at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:318)
            at android.view.View.requestLayout(View.java:15722)
            at android.widget.TextView.checkForRelayout(TextView.java:6605)
            at android.widget.TextView.setText(TextView.java:3804)
            at android.widget.TextView.setText(TextView.java:3662)
            at android.widget.TextView.setText(TextView.java:3637)
            at com.example.ayim.madoc.docProfile$DocProfile.doInBackground(docProfile.java:113)
            at com.example.ayim.madoc.docProfile$DocProfile.doInBackground(docProfile.java:67)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask.run(FutureTask.java:234)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:838) 

This is the code I have written.

package com.example.ayim.madoc;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;


public class docProfile extends ActionBarActivity {

    TextView nameDoc;
    TextView iddoc;
    TextView icdoc;
    TextView adddoc;
    TextView notel;

    private ProgressDialog pDialog;

    //JSONArray docprofile = null;

    JSONParser jsonParser = new JSONParser();

    private static final String LOGIN_URL = "http://104.223.3.210/madoc/docprofile.php";

    //JSON element ids from repsonse of php script:
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";
    private static final String TAG_DOCTOR = "doctor";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_IC = "ic";
    private static final String TAG_ADDRESS = "address";
    private static final String TAG_NOTEL = "notel";
    //String iddoctor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_doc_profile);


       // Intent i = getIntent();

        //iddoctor = i.getStringExtra("idDoc");

        new DocProfile().execute();

        //nameDoc = (TextView) findViewById(R.id.docId);
        //nameDoc.setText(getIntent().getExtras().getString("idDoc"));


    }


    class DocProfile extends AsyncTask<String, String, String> {


/*
        @Override
        protected void onPreExecute() {

            super.onPreExecute();
            pDialog = new ProgressDialog(docProfile.this);
            pDialog.setMessage("Loading Profile. Please wait....");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
*/

        @Override
        protected String doInBackground(String... params) {


            String idd = getIntent().getExtras().getString("idDoc");

                    int success;
                    try {

                        List<NameValuePair> param = new ArrayList<NameValuePair>();
                        param.add(new BasicNameValuePair("id",idd));

                        JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "GET", param);

                        Log.d("Doctor Profile", json.toString());

                        success = json.getInt(TAG_SUCCESS);

                        if (success == 1) {

                            JSONArray docProfile = json.getJSONArray(TAG_DOCTOR);

                            JSONObject docProf = docProfile.getJSONObject(0);

                            nameDoc = (TextView) findViewById(R.id.name);
                            iddoc = (TextView) findViewById(R.id.docId);
                            icdoc = (TextView) findViewById(R.id.icdoctor);
                            adddoc = (TextView) findViewById(R.id.addressdoc);
                            notel = (TextView) findViewById(R.id.noteldoc);

                            nameDoc.setText(docProf.getString("name"));
                            iddoc.setText(docProf.getString("id"));
                            icdoc.setText(docProf.getString("ic"));
                            adddoc.setText(docProf.getString("address"));
                            notel.setText(docProf.getString("noTel"));

                        } else {
                            //no doctor
                        }

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




            return null;
        }

        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product deleted
            pDialog.dismiss();
            //if (file_url != null){
              //  Toast.makeText(docProfile.this, file_url, Toast.LENGTH_LONG).show();
           // }

        }


    }
}
harry
  • 13
  • 5
  • 1
    Did you read some of http://stackoverflow.com/search?q=CalledFromWrongThreadException ? If no I would suggest this [comment](http://stackoverflow.com/questions/10118301/android-viewrootimplcalledfromwrongthreadexception#comment34514715_10118377) –  Apr 28 '15 at 13:55
  • Yes, don't call from the wrong thread. https://stackoverflow.com/q/5161951/603270 – shkschneider Apr 28 '15 at 13:56
  • Yes...and I have already try the method..and the application crash.. – harry Apr 28 '15 at 14:01

1 Answers1

0

The error tells you clearly that you cannot access your View hierarchy outside of your main thread.

Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Since you are using an AsyncTask, you should preferably update your UI elements in onPostExecute. This method will run on the main thread. You could pass docProf into onPostExecute and make your changes there.

protected void onPostExecute(String file_url) {
    nameDoc = (TextView) findViewById(R.id.name);
    iddoc = (TextView) findViewById(R.id.docId);
    icdoc = (TextView) findViewById(R.id.icdoctor);
    adddoc = (TextView) findViewById(R.id.addressdoc);
    notel = (TextView) findViewById(R.id.noteldoc);

    nameDoc.setText(docProf.getString("name"));
    iddoc.setText(docProf.getString("id"));
    icdoc.setText(docProf.getString("ic"));
    adddoc.setText(docProf.getString("address"));
    notel.setText(docProf.getString("noTel"));

    pDialog.dismiss();
}

To send your data to onPostExecute, you need to make three changes:

1:

class DocProfile extends AsyncTask<String, String, String> {

Becomes...

class DocProfile extends AsyncTask<String, String, JSONObject> {

2.

if (success == 1) {

Becomes...

if (success == 1) return docProf;

3.

protected void onPostExecute(String file_url) {

Becomes...

protected void onPostExecute(JSONObject docProf) {

You can now use docProf in onPostExecute.

Alternatively, everything in this block:

if (success == 1) {

... needs to run on the UI thread.

Example:

(new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        nameDoc = (TextView) findViewById(R.id.name);
        iddoc = (TextView) findViewById(R.id.docId);
        icdoc = (TextView) findViewById(R.id.icdoctor);
        adddoc = (TextView) findViewById(R.id.addressdoc);
        notel = (TextView) findViewById(R.id.noteldoc);

        nameDoc.setText(docProf.getString("name"));
        iddoc.setText(docProf.getString("id"));
        icdoc.setText(docProf.getString("ic"));
        adddoc.setText(docProf.getString("address"));
        notel.setText(docProf.getString("noTel"));
    }
});
Knossos
  • 15,802
  • 10
  • 54
  • 91