私はかなり前からこれを自分で理解しようとしてきました..試行錯誤と研究によってですが、私はそれを理解することができないようです。私は非同期接続とネットワーク接続がかなり苦手なので、見過ごされているのは単純なことかもしれません。とにかく...関連するコードサンプルと説明を貼り付けます。
私の問題の簡単な背景。私は自分のアプリでRottenTomatoesAPIを使用しており、データの解析にGSONを使用しています。私は当初2.3をターゲットにしていましたが、これはうまくいきました。それから私はICSをサポートすることに決めました、そしてもちろん「UIスレッドでネットワーク操作がありません」に遭遇しました-それで私は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);
しかし、それでも問題は解決しません。それでも、UIでのネットワークアクションの実行に関するエラーが発生します。私が理解する必要があるのは、私が推測するAsyncTaskから「retrieveStream」を呼び出す方法です。現在、そのクラスは次のようになっています。
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メソッドを本質的に非同期で実行する方法を誰かが知っているなら、それは素晴らしいことです。私が言ったように、私は多くのことを試み、たくさんの研究をしましたが、有用なものを思い付くことができませんでした。