0

我在 android 上很新,我对 asyncTask 和线程有问题。我如何在这段代码中使用 AsyncTask?当我使用这样的 productIdList 时为空。这就是我想使用 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;
4

1 回答 1

0

异步任务隐式地将方法和命令从主线程移开,因为主线程应该运行所有任务。

创建一个新班级,

public class <NAME OF CLASS> extends AsyncTask<Void, String, String>

扩展部分基本上扩展(在 c# 中继承)接受一些参数,这些参数与您将要使用的 3 个覆盖方法相关。

  1. onPreExecute - 这是一种预先做事的方法,我个人不需要我写的代码(我自己还是 android 新手)

  2. onDoInBackgound - 这是 AsyncTask 的主要部分,这是您的所有方法将执行的地方,这是所有逻辑发生的地方。这正是它在罐头上所说的,它在另一个线程的后台做所有事情。

  3. onPostExecute - 当 onDoInBackground 完成时,它将运行 OnPostExecute 方法,我通常在 onDoInBackgroun 方法上有一个字符串返回,这确保它进展到 onPostExecute,因为我发现有时没有它它并没有完全进展。

然后在 postExecute 方法中告诉它所有逻辑完成后你想做什么,例如你可以在主线程上有一个监听器,你可以在其中从 AysncTask 调用该监听器,即 postExecute 方法中的 listener.onSuccess(results) ,这将使您返回原始线程。

希望这可以帮助

于 2013-08-01T11:25:25.697 回答