I want to implement a class which will handle all HTTP Requests of my application, which will be basically:
So, I will have to get the result string from the server (JSON) and pass it to another methods to handle the responses.
I currently have this methods:
public class Get extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... arg) {
String linha = "";
String retorno = "";
mDialog = ProgressDialog.show(mContext, "Aguarde", "Carregando...", true);
// Cria o cliente de conexão
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(mUrl);
try {
// Faz a solicitação HTTP
HttpResponse response = client.execute(get);
// Pega o status da solicitação
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) { // Ok
// Pega o retorno
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// Lê o buffer e coloca na variável
while ((linha = rd.readLine()) != null) {
retorno += linha;
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return retorno;
}
@Override
protected void onPostExecute(String result) {
mDialog.dismiss();
}
}
public JSONObject getJSON(String url) throws InterruptedException, ExecutionException {
// Determina a URL
setUrl(url);
// Executa o GET
Get g = new Get();
// Retorna o jSON
return createJSONObj(g.get());
}
But the g.get()
returns a empty response. How can I fix that?
Android AsyncTask is an abstract class provided by Android which gives us the liberty to perform heavy tasks in the background and keep the UI thread light thus making the application more responsive. Android application runs on a single thread when launched.
AsyncTask is used to perform time talking operations in android, but it's marked as deprecated from android 11.
service is like activity long time consuming task but Async task allows us to perform long/background operations and show its result on the UI thread without having to manipulate threads.
In newer Android versions, 5 threads are create by default, and the ThreadPoolExecutor will attempt to run the AsyncTask s on these 5 threads. If you create more than 5 AsyncTask s, it may either queue them or create new threads (but only up to 128).
I think you didn't understand exactly the way AsyncTask works. But I believe you wish to reuse the code for different tasks; if so, you can create an abstract class and then extend it implementing an abstract method you created. It should be done like this:
public abstract class JSONTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg) {
String linha = "";
String retorno = "";
String url = arg[0]; // Added this line
mDialog = ProgressDialog.show(mContext, "Aguarde", "Carregando...", true);
// Cria o cliente de conexão
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(mUrl);
try {
// Faz a solicitação HTTP
HttpResponse response = client.execute(get);
// Pega o status da solicitação
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) { // Ok
// Pega o retorno
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// Lê o buffer e coloca na variável
while ((linha = rd.readLine()) != null) {
retorno += linha;
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return retorno; // This value will be returned to your onPostExecute(result) method
}
@Override
protected void onPostExecute(String result) {
// Create here your JSONObject...
JSONObject json = createJSONObj(result);
customMethod(json); // And then use the json object inside this method
mDialog.dismiss();
}
// You'll have to override this method on your other tasks that extend from this one and use your JSONObject as needed
public abstract customMethod(JSONObject json);
}
And then the code on your activity should be something like this:
YourClassExtendingJSONTask task = new YourClassExtendingJSONTask();
task.execute(url);
You are not executing the task. You are just creating it. I think you need to make:
Get g = new Get();
g.execute();
But you are using the lifecycle of the task in a wrong way. OnPostExecute runs on the Main thread, where you should do all the updates as needed. You can pass the task a View for example.
It appears that you are never actually starting the AsyncTask by calling the execute() function on the Get object.
try this code:
Get g = new Get();
g.execute();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With