Problemas do Android com o AsyncTask e o InputStream
Eu tenho tentado descobrir isso por conta própria por um bom tempo .. por tentativa / erro, bem como pesquisa, mas eu simplesmente não consigo entender isso. Eu sou muito ruim com conexões assíncronas e de rede e stuch, por isso pode ser algo simples que estou procurando. De qualquer forma ... vou colar algumas amostras de código relevantes e explicações.
Fundo rápido do meu problema. Estou trabalhando com a API Rotten Tomatoes para meu aplicativo e estou usando o GSON para analisar seus dados. Eu estava inicialmente segmentando 2.3, e isso funcionou bem. Então decidi ter suporte para o ICS e, é claro, corri para a "nenhuma operação de rede no thread da interface do usuário" - então comecei a me aprofundar no AsyncTask.
Aqui está o meu método InputStream:
private InputStream retrieveStream(String url) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet getRequest = new HttpGet(url);
try {
HttpResponse getResponse = client.execute(getRequest);
final int statusCode = getResponse.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w(getClass().getSimpleName(),
"Error " + statusCode + " for URL " + url);
return null;
}
HttpEntity getResponseEntity = getResponse.getEntity();
return getResponseEntity.getContent();
}
catch (IOException e) {
getRequest.abort();
Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
}
return null;
}
Que estava funcionando bem na minha atividade principal, e agora está me dando problemas ao tentar "convertê-lo" em AsyncTask. Eu tenho chamado assim:
InputStream source = retrieveStream( url parameter );
Então eu tentei mover esse método para minha classe AsyncTask e chamá-lo assim:
private PerformMovieSearch performSearch = new PerformMovieSearch(this);
InputStream source = performSearch.retrieveStream(movieQueryUrl);
Mas isso não é suficiente, ainda recebo o erro sobre a realização de ações de rede na interface do usuário. O que eu preciso descobrir é como chamar 'retrieveStream' da AsyncTask, eu acho. Atualmente essa classe se parece com isso:
package net.neonlotus.ucritic;
[imports]
public class PerformMovieSearch extends AsyncTask<String, Void, String> {
private final Context context;
private ProgressDialog progressDialog;
public PerformMovieSearch(Context context){
this.context = context;
}
@Override
protected String doInBackground(String... urls) {
retrieveStream(urls[0]);
return null;
}
@Override
protected void onPreExecute() {
progressDialog= ProgressDialog.show(context, "Please Wait","Searching movies", true);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progressDialog.dismiss();
MyActivity.mListAdapter.notifyDataSetChanged();
}
public InputStream retrieveStream(String url) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet getRequest = new HttpGet(url);
try {
HttpResponse getResponse = client.execute(getRequest);
final int statusCode = getResponse.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
Log.w(getClass().getSimpleName(),
"Error " + statusCode + " for URL " + url);
return null;
}
HttpEntity getResponseEntity = getResponse.getEntity();
return getResponseEntity.getContent();
} catch (IOException e) {
getRequest.abort();
Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
}
return null;
}
}
O "doinbackground" é o que precisa ser mudado ... mas não consigo encontrar uma maneira direta de fazer isso funcionar corretamente. Eu estava executando usando
new PerformMovieSearch(this).execute(movieQueryUrl);
Eu sei que é um monte de coisas, potencialmente confuso ... mas se alguém sabe como essencialmente fazer o método retrieveStream de forma assíncrona, isso seria ótimo. Como eu disse, tentei muitas coisas, fiz muita pesquisa, só não consegui fazer nada de útil.