我在Android上很新,我遇到了asyncTask和线程的问题。 我如何在此代码中使用AsyncTask? 当我使用像这样的productIdList来null。这就是为什么我想使用AsyncTask。我认为使用AsyncTask可以工作。
提前感谢。
public ArrayList<String> getProductData() {
final ArrayList<String> productIdList = new ArrayList<String>();
new Thread(new Runnable() {
public void run() {
HttpClient httpclient= new DefaultHttpClient();
GeneralConstans GC = new GeneralConstans();
// Products will be stated in memory
HttpPost httpget = new HttpPost(GC.UrlConstants);
HttpResponse response;
String result = null;
try {
HttpContext ctx = new BasicHttpContext();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
2);
httpget.setEntity(new UrlEncodedFormEntity(nameValuePairs,
"UTF-8"));
response = httpclient.execute(httpget, ctx);
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
result = EntityUtils.toString(resEntity);
JSONArray arr = new JSONArray(result);
Gson gson = new Gson();
if (arr.length() > 0) {
for (int j = 0; j < arr.length(); j++) {
Product p = gson.fromJson(arr.getString(j),
Product.class);
productIdList.add(p.toString());
}
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (SocketException e) {
/*if (checkAbortStatus(e.getMessage()) == true) {
handler.sendEmptyMessage(0);
}*/
} catch (IOException e) {
/*if (checkAbortStatus(e.getMessage()) == true) {
handler.sendEmptyMessage(0);
}*/
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
}).start();
return productIdList;
答案 0 :(得分:0)
Async任务隐式地将方法和命令从主线程移开,因为MAIN线程应该运行所有任务。
创建一个新类
public class <NAME OF CLASS> extends AsyncTask<Void, String, String>
扩展部分基本上扩展(在c#中继承)接受一些参数,这些参数与你将要使用的3个覆盖方法有关。
onPreExecute - 这是一种预处理方法,我个人不需要我编写的代码(我自己还是Android的新手)
onDoInBackgound - 这是AsyncTask的主要部分,这是你所有方法的所在,这是所有逻辑都会发生的地方。这正是它在锡上所说的,它在另一个线程的后台完成所有工作。
onPostExecute - 当onDoInBackground完成时,它将运行OnPostExecute方法,我通常在onDoInBackgroun方法上有一个String返回,这确保它进展到onPostExecute,因为我发现有时没有它它没有完全进展。 / p>
然后在postExecute方法中,你告诉它在完成所有逻辑后你想要做什么,例如你可以在主线程上有一个监听器,你可以从AysncTask调用该监听器,即listener.onSuccess(results)in postExecute方法,它将返回原始线程。
希望这有帮助