1

I have a problem with my class who use a http connection. The error is for the connection, i read that error mean that i have to use the AsyncTask, but i used it and my app still doesn't work. Here there is the code:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    new GetCoursesDetails().execute();
}
class GetCoursesDetails extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(InfoCorsi.this);
        pDialog.setMessage("Loading courses details. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params){

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("pid", pid));

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

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

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

                        // get first product object from JSON Array
                        JSONObject product = productObj.getJSONObject(0);



                    }else{
                        // product with pid not found
                    }
                } 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 got all details
        pDialog.dismiss();
    }
}

The class jSONParser work because i used it to make a connection for another class, the error in this case is of the type android.os.NetworkOnMainThreadException:

1-18 13:44:46.478 23304-23318/? E/art: Failed sending reply to debugger: Broken pipe
11-18 13:44:53.635 23304-E/AndroidRuntime: FATAL EXCEPTION: main
11-18 13:44:53.635 23304-E/AndroidRuntime: Process: com.piemonteorientale.cus.cuspo, PID: 23304
11-18 13:44:53.635 23304-E/AndroidRuntime: android.os.NetworkOnMainThreadException
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at libcore.io.IoBridge.connect(IoBridge.java:122)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.net.Socket.connect(Socket.java:882)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at com.piemonteorientale.cus.cuspo.JSONParser.makeHttpRequest(JSONParser.java:62)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at com.piemonteorientale.cus.cuspo.InfoCorsi$GetCoursesDetails$1.run(InfoCorsi.java:89)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5290)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
11-18 13:44:53.635 23304-E/AndroidRuntime:     at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
Angad Tiwari
  • 1,738
  • 1
  • 12
  • 23
Daniel
  • 53
  • 1
  • 7

2 Answers2

3

Get rid of runOnUiThread() from your doInBackground() method.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • hi , I was checking this [asnwer](http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts/17583324#17583324) for levit user about internet connection if there is internet, there is some problems with `ping` in some devices as comments stated, I want your help to know if you have an already answer , if no ill post it . do you think levit a best practice to apply on my app ? – Moudiz Nov 19 '15 at 09:07
0

If you want to show your progress you can use AsyncTask.onProgressUpdate (Progress...). This method will run on the UI Thread. Don't make any network calls from it. Use AsyncTask.publishProgress (Progress...) from your AsyncTask.doInBackground (Params...) method to invoke the progress update.

See AsyncTask API Documentation

Emanuel Seidinger
  • 1,272
  • 1
  • 12
  • 21