Проблемы Android с AsyncTask и InputStream
Я пытался выяснить это самостоятельно довольно долгое время ... методом проб / ошибок, а также исследованиями, но я просто не могу понять это. Я довольно плохо разбираюсь с Async, сетевыми подключениями и стучами, так что это может быть что-то простое, что я пропускаю. В любом случае ... Я вставлю некоторые соответствующие примеры кода и объяснения.
Быстрый фон моей проблемы. Я работаю с Rotten Tomatoes API для моего приложения и использую GSON для анализа их данных. Я изначально был нацелен на 2.3, и это работало нормально. Затем я решил поддержать ICS и, конечно же, столкнулся с «отсутствием сетевой операции в потоке пользовательского интерфейса» - поэтому я начал вникать в AsyncTask.
Вот мой метод 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;
}
Который отлично работал в моей основной деятельности, и теперь вызывает проблемы при попытке «преобразовать» его в AsyncTask. Я назвал это так:
InputStream source = retrieveStream( url parameter );
Затем я попытался переместить этот метод в мой класс AsyncTask и вызвать его так:
private PerformMovieSearch performSearch = new PerformMovieSearch(this);
InputStream source = performSearch.retrieveStream(movieQueryUrl);
Но это не значит, что вы получаете ошибку при выполнении сетевых действий в интерфейсе пользователя. Я должен выяснить, как вызвать 'retrieveStream' из AsyncTask. В настоящее время этот класс выглядит так:
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;
}
}
«Doinbackground» - это то, что нужно изменить ... но я не могу найти прямой способ заставить это работать должным образом. Я выполнял, используя
new PerformMovieSearch(this).execute(movieQueryUrl);
Я знаю, что это много вещей, которые могут сбить с толку ... но если кто-нибудь знает, как по существу выполнять метод retrieveStream асинхронно, это было бы здорово. Как я уже говорил, я много чего перепробовал, много исследовал, просто не смог придумать ничего полезного.