【问题标题】:AsyncTask keep returning nullAsyncTask 不断返回 null
【发布时间】:2015-11-19 04:57:54
【问题描述】:

我正在使用 for 循环来调用 asynctask 这就是我在片段中调用异步任务的方式:

private void LoadPartiList() {
for (int i = 0; i < participants.length; i ++){
    String getlistparti = cmd.getPartList();
    participants = getlistparti.split(",");
    partiparti = ((CommentandLikeActivity)getActivity()).getparticipantlist(participants[i]);
    Log.d("test","testlogcat " + partiparti);

}

这里是我在包含片段的活动中分配的异步任务:

public ArrayList<User> getparticipantlist(final String participationID) {
    final ArrayList<User> list = new ArrayList<User>();
    final User user = new User();
    new AsyncTask<String, String, ArrayList<User>>() {

        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected ArrayList<User> doInBackground(String... params) {


            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    // Check for success tag
                    int success;
                    try {
                        // Building Parameters

                        Log.d("participantid", "17112015 " + participationID);
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("userid", participationID));


                        // getting product details by making HTTP request
                        // Note that product details url will use GET request
                        JSONObject json = jsonParser.makeHttpRequest(
                                "http://192.168.168.111:80/testing/participationlist.php", "GET", params);

                        // check your log for json response
                        Log.d("Single Product Details", json.toString());

                        // json success tag
                        success = json.getInt("success");
                        if (success == 1) {
                            // successfully received product details
                            JSONArray productObj = json
                                    .getJSONArray("product"); // JSON Array

                            // get first product object from JSON Array
                            JSONObject product = productObj.getJSONObject(0);





                            user.setId(String.valueOf(product.getString(String.valueOf("vuid"))));
                            user.setUsername(product.getString("vusername"));
                            user.setProfileimage(product.getString("vprofileimage"));
                            list.add(user);

                            Log.d("","getwalalala " +product.getString(String.valueOf("vuid")) +" : "+ product.getString("vusername") + " : " +product.getString("vprofileimage") );


                        }else{
                            // product with pid not found
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });

            return list;
        }



        @Override
        protected void onPostExecute(ArrayList<User> list) {
            List<User> mUserlist = new ArrayList<User>();
            mAdapterr = new participantlistAdapter(getApplicationContext(), mUserlist);
            mAdapterr.Update();
            mAdapterr.add(user);

        }
    }.execute(null, participationID, null);

    return list;
}

这是我在运行 Asynctask 时记录的内容

Logcat for Log.d("","getwalalalala")

但是为什么它只会返回 [] 或 null 呢?我的代码有什么问题吗?请帮忙... 我想根据participants.length中的长度循环userid从phpserver获取用户名并显示在listview中,我该怎么做? 上网查了几天也没得到答案

【问题讨论】:

  • 你为什么在doInBackground的UI线程上运行后台任务?
  • @activesince93 这是一个在线示例,它能够从 php 获取数据,也是我知道从 php 服务器获取数据的唯一方法。我不太确定为什么它在 doInBackground 中运行后台任务。请帮忙编辑
  • 谢谢@activesince93,我会试试的:)

标签: android android-fragments android-asynctask


【解决方案1】:

当您尝试从不正确的 AsyncTask 返回数据时。 AsyncTask doInBackground 将数据返回到您的 onPostExecute。因此,无论您要返回什么,都只能在 onPostExecute 中接收。但是您仍然想实现 Asynctask 然后您可以通过以下方式之一实现:

  1. 通过将 AsyncTask 定义为 Activity 中的内部私有类,并直接使用 onPostExecute 中的数据来更新您的 ui。

  2. 第二种方法是将接口回调传递给您的 asynctask,并在该接口回调的帮助下将您的 ui 从 AsyncTask 更新为活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2012-05-11
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多