Kevin
Kevin

Reputation: 3239

Android - HTTP GET on separate thread

Background: I am new to android programming. I want to simply do an http get request to a local server.

I want to pass this request a name as a parameter and want to get a return in json. This issue that I cannot execute it on the main thread. How can I do this?

Here is what I tried:

main class:

itemsAdapter.add(get.getName(device.getName()));

Seperate class in same file:

private class httpGet extends AsyncTask<Editable, Void, Integer> {
        protected String doInBackground(Editable... params) {
            Editable editable = params[0];
            return getName(editable.toString());
        }
        final String getName(String btName) {
            HttpResponse response = null;
            String result = "";
            try {
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet();
                URI website = new URI("http://192.168.1.105/getName.php?q=" + btName);
                request.setURI(website);
                response = client.execute(request);
                // Convert String to json object
                JSONObject json = new JSONObject(response.toString());

                // get LL json object
                JSONObject json_Name = json.getJSONObject("Name");

                // get value from LL Json Object
                name = json_Name.getString("value"); //<< get value here
            } catch (URISyntaxException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
                // Do something to recover ... or kill the app.
            }

            return result;
        }

        protected void onPostExecute(Integer result) {
            // here you have the result
        }

I am not sure if this is even a good way to do this task. I also have no idea how I would call it.

Upvotes: 0

Views: 1491

Answers (2)

jjz
jjz

Reputation: 2057

AsyncTask allows you to perform a background operation in a different thread without manipulating threads/handlers.

It should be this way:

private class httpGet extends AsyncTask<ParamForDoInBackground, ParamForOnProgressUpdate, ParamForOnPostExecute> {
     protected Long doInBackground(ParamForDoInBackground... urls) {
        // do the request here
     }

     protected void onProgressUpdate(ParamForOnProgressUpdate progress) {
        // if you need to show any progress of the 
        // request from doInBackground
     }

     protected void onPostExecute(ParamForOnPostExecute result) {
        // this method will run when doInBackground
        // is done executing
     }
}

Then you can execute an AsyncTask:

new httpGet().execute(ParamForDoInBackground);

You can use the following as a reference: AndroidBackgroundProcessing and Android Developer AsyncTask

Upvotes: 1

Gerardo Suarez
Gerardo Suarez

Reputation: 362

You should learn how the asyncTask work. Inside DoInBackground you should to put the code referent to the HTTPRequest. I recommend to use methods to improve the understanding of code. Here is an example of one of my apps:

 public String query(String uri) {
    HttpClient cliente = new DefaultHttpClient();
    HttpContext contexto = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(uri);
    HttpResponse response = null;
    String resultado=null;

    try {
        List<NameValuePair> params = new ArrayList<NameValuePair>(2);
        params.add(new BasicNameValuePair("dato", cod_restaurante));
        httpPost.setEntity(new UrlEncodedFormEntity(params));
        response = cliente.execute(httpPost, contexto);
        HttpEntity entity = response.getEntity();
        resultado = EntityUtils.toString(entity, "UTF-8");


    } catch (Exception e) {
        // TODO: handle exception
    }
    return resultado;
}

 private class MyAsyncTask extends AsyncTask<String, Integer, String>{

    @Override
    protected String doInBackground(String... params) 
    {
        result=query(params[0]);
        return result;
    }

    protected void onPostExecute(final String resultadoDoInBackground)
    { 
      //here put the code to modify the UI
     }
 }

Then in your activity onCreate() method you execute the Asynktask.

 new MyAsyncTask().execute("    ");

You can read more about AsyncTask here: AsyncTask Android Developer

Upvotes: 1

Related Questions