Reputation: 304
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?
Upvotes: 5
Views: 17494
Reputation: 756
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();
Upvotes: 1
Reputation: 1626
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);
Upvotes: 14
Reputation: 9978
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.
Upvotes: 1