很长一段时间以来,我一直试图自己解决这个问题。通过反复试验和研究,但我似乎无法弄清楚。我对异步和网络连接以及 stuch 非常糟糕,所以这可能是我正在寻找的简单的东西。无论如何...我将粘贴一些相关的代码示例和解释。
我的问题的快速背景。我正在为我的应用程序使用 Rotten Tomatoes API,并且正在使用 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 方法,那就太好了。就像我说的,我尝试了很多东西,做了很多研究,就是想不出任何有用的东西。