Tengo una clase común decir, por ejemplo, clase A que se extiende AsyncTask
y tiene todos los métodos implementados, es decir, onPreExecute
, doinbackground
y onPostExecute
.Clase común para AsyncTask en Android?
Ahora, hay otras clases que desean usar el objeto Clase A.
Di Clase B utiliza la clase A en la forma que a continuación
A a = new A(context)
a.execute(url)
A continuación, voy a buscar el resultado en método get. Pero obtener el método no es la forma correcta de usar AsyncTask. Me gustaría obtener el resultado en onPostExecute
. Para eso traté de usar un parámetro booleano que solo se cumplirá en onpostexecute
. La clase B verificará hasta que se haga verdadera y cuando se vuelva verdadera obtendrá el resultado.
Pero esto de alguna manera está bloqueando la aplicación.
He colocado el código para asynctask a continuación.
'
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
public class A extends AsyncTask<String, Void, String>
{
private Context context = null;
private final HttpClient httpClient = new DefaultHttpClient();
private String content = null;
//private String error = null;
private String finalResult = null;
private static boolean isResult = false;
private ProgressDialog progressDialog = null;
public BabbleVilleSyncTask(Context context)
{
this.context = context;
progressDialog = new ProgressDialog(this.context);
}
protected void onPreExecute()
{
progressDialog.setMessage("Please Wait....");
progressDialog.show();
}
protected String doInBackground(String... urls)
{
try
{
//urls[0] = URLEncoder.encode(urls[0], "UTF-8");
HttpGet httpget = new HttpGet(urls[0]);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
content = httpClient.execute(httpget, responseHandler);
}
/*catch(UnsupportedEncodingException ue)
{
error = ue.getMessage();
}*/
catch (ClientProtocolException e)
{
//error = e.getMessage();
cancel(true);
}
catch (IOException e)
{
//error = e.getMessage();
cancel(true);
}
httpClient.getConnectionManager().shutdown();
return content;
}
protected void onPostExecute(String result)
{
finalResult = result;
progressDialog.dismiss();
System.out.println("on Post execute called");
isResult = true;
}
public boolean getIsResult()
{
return isResult;
}
public void setIsResult(boolean flag)
{
isResult = flag;
}
public String getResult()
{
return finalResult;
}
}
'
Puede alguien que me haga saber lo que puede ser el problema?
Saludos
Sunil
Muchas gracias por esto. Pero, ¿qué sucede si quiero llamar a 3 URL en un método de ejecución? Entonces, ¿cómo podemos buscar la respuesta? Cualquier idea – sunil
Tiene un método onProgressMethod que debería hacer bien el trabajo, si llama a publishProgress desde su tarea para cada url. – SirDarius
¿Podría elaborar un poco más? Actualmente estoy intentando convertir este método: public static invokeWebServiceRequest (String uri, String username, String password, String targetKey); dentro de una clase que amplía AsyncTask. ¿cómo pasaría esos parámetros (de mi método anterior) a doInBackground (Params ...)? gracias! – Cole