Проблемы 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 {
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 асинхронно, это было бы здорово. Как я уже говорил, я много чего перепробовал, много исследовал, просто не смог придумать ничего полезного.