异步任务未在Fragment中执行

时间:2014-03-29 16:18:51

标签: java android asynchronous

我一直在谷歌搜索相当多的工作,以某种方式它不适合我。我正在做的是运行片段,当我打开它时,我希望将它从mySQL数据库中调用的数据填充到listview中。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.narutohd.ServiceHandler.ServiceHandler;

import android.app.ListFragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class FindPeopleFragment extends ListFragment {

     private ProgressDialog pDialog;

        // URL to get contacts JSON
        private static String url = "REMOVED";

        // JSON Node names
        private static final String TAG_CONTACTS = "products";
        private static final String TAG_ID = "pid";
        private static final String TAG_NAME = "link";

        // contacts JSONArray
        JSONArray contacts = null;
        private List<HashMap<String, String>> contactList;
        private SimpleAdapter adapter;

    public FindPeopleFragment(){}

    public void onActivityCreated(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            contactList = new ArrayList<HashMap<String, String>>();
            adapter = new SimpleAdapter(getActivity(), contactList,
                R.layout.list_item, new String[] { TAG_ID, TAG_NAME },
                new int[] { R.id.pid, R.id.episode });

            ListView lv = getListView();
            lv.setAdapter(adapter);
            new GetContacts().execute();
            super.onActivityCreated(savedInstanceState);
        }
     private class GetContacts extends AsyncTask<Void, Void, Void> {

            @Override
            protected void onPreExecute() {


            }

            @Override
            protected Void doInBackground(Void... arg0) {
               //Code
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                } else {
                    Log.e("ServiceHandler", "Couldn't get any data from the url");
                }

                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
               //Code
            }

        }

}

这是我目前的代码,但它在加载时所做的一切都没有,没有任何错误。我相信它应该没问题,因为它适用于某项活动。我认为没有任何理由。我想到的一个替代方法是将onPostExecute数据传递给一个公共变量,然后使用setListAdapter实时(onActivityCreated)填充它,因为我知道它现在可能不起作用的原因是因为listview已经在oNActivity中充气了推出。

非常感谢您的帮助!

很抱歉,因为我不熟悉Java / Android,想知道我做错了,还是另一种方法可以从mainActivity运行Async Task,然后在片段上填充listview呢?

我运行下面的代码使用adapter.notifyDataSetChanged,但它不起作用。 GetContacts仍未执行。

我很确定问题在于GetContacts DoinBackground没有被执行。或者它似乎没有,因为我甚至没有看到我的URL出现(哪个应该,我根本没有看到pDialog启动)。

3 个答案:

答案 0 :(得分:0)

我认为你应该调用“adapter.notifyDataSetChanged();”

此方法可以动态修改ListView数据。

private List<HashMap<String, String>> contactList;
private SimpleAdapter adapter;

public void onActivityCreated(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    contactList = new ArrayList<HashMap<String, String>>();
    adapter = new SimpleAdapter(getActivity(), contactList,
        R.layout.list_item, new String[] { TAG_ID, TAG_NAME },
        new int[] { R.id.pid, R.id.episode });

    ListView lv = getListView();
    lv.setAdapter(adapter);
    new GetContacts().execute();
    super.onActivityCreated(savedInstanceState);
}


public class GetContacts extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected Void doInBackground(Void... arg0) {
                    //Your code...
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        adapter.notifyDataSetChanged();
    }
}

答案 1 :(得分:0)

我不知道这是所有的代码,但我想你应该添加一个onCreateView。并使用listview

的布局

答案 2 :(得分:0)

自己解决,使用onResume更新。