android - 在 Android Fragment 中实现 AsyncTask

标签 android android-fragments android-asynctask

首先,我开发了一个 Activity,其中解析 json 输出并将其显示在列表中。效果很好。然后,我将代码从 Activity 转换为 Fragment,如下所示。现在,当执行 AsyncTask 时,我得到一个 NullPointerException
没有 AsyncTask 它也能工作。这就是为什么我在网上发表评论, task.execute();。 数据来自服务器,因此使用AsyncTask是必要的。

有人可以帮我解决这个问题吗?

 public class FragmentLoadtransferAddon extends SherlockFragment {
        ProgressBar webservicePG;
         ListAdapter adapter ;
        ListView lv;
    String empid=null;
    ArrayList<HashMap<String, String>> dataList ;
    HashMap<String, String> map;
    private static final String TAG_ITEMNAME = "ItemCode";
    private static final String TAG_QTY = "Quantity";
        public FragmentLoadtransferAddon() {

        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.loadtransferaddon, container, false);
             dataList = new ArrayList<HashMap<String, String>>();
             lv=(ListView) rootView.findViewById(R.id.loadtransfer_form_addon_ListView);
             webservicePG = (ProgressBar) rootView.findViewById(R.id.daystart_form_progressBar1);
               adapter = new SimpleAdapter(getActivity(), dataList,
                        R.layout.rawcurrentstock,
                        new String[] { TAG_ITEMNAME, TAG_QTY}, new int[] {
                                R.id.rawcurrentsock_form_productname,R.id.rawcurrentsock_form_productqty});

    //      
            return rootView;
        }
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onActivityCreated(savedInstanceState);
               AsyncCallWS task = new AsyncCallWS();
    //          // Call execute
    //          task.execute();

                  String json = AddonWebService.invokeDaystartWS(empid,
                            "GetLoadItems");
                    if (json != null) {
                        try {

                            if (json.contains("<!--"))

                                json = json.substring(0, json.indexOf("<!--"));
                            Log.d("Response according to Gettabledata after :: ", " "
                                    + json);
                            jsonObj.getJSONArray("Table");

                            JSONArray tarray = new JSONArray(json);
                            Log.d("tarraytable: ",
                                    " " + tarray);

                            for (int i = 0; i < tarray.length(); i++) {
                                JSONObject jsonChildNode = tarray.getJSONObject(i);

                                String name = jsonChildNode.getString(TAG_ITEMNAME);
                                String qty = jsonChildNode.getString(TAG_QTY);
                                // creating new HashMap
                                map = new HashMap<String, String>();

                                // adding each child node to HashMap key => value
                                map.put(TAG_ITEMNAME, name);
                                map.put(TAG_QTY, qty);

                            dataList.add(map);
                        }
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    } else {
                        Log.e("JSON Data", "Didn't receive any data from server!");
                    }
                    lv.setAdapter(adapter);

        }
        private class AsyncCallWS extends AsyncTask<String, Void, Void> {
            @Override
            protected void onPreExecute() {
                webservicePG.setVisibility(View.VISIBLE);
                super.onPreExecute();
            }

            @Override
            protected Void doInBackground(String... params) {
                  String json = AddonWebService.invokeDaystartWS(empid,
                            "GetLoadItems");
                    if (json != null) {
                        try {

                            if (json.contains("<!--"))

                                json = json.substring(0, json.indexOf("<!--"));
                            Log.d("Response according to Gettabledata after :: ", " "
                                    + json);
                            JSONArray tarray = new JSONArray(json);
                            Log.d("tarraytable: ",
                                    " " + tarray);

                            for (int i = 0; i < tarray.length(); i++) {
                                JSONObject jsonChildNode = tarray.getJSONObject(i);

                                String name = jsonChildNode.getString(TAG_ITEMNAME);
                                String qty = jsonChildNode.getString(TAG_QTY);
                                // creating new HashMap
                                map = new HashMap<String, String>();

                                // adding each child node to HashMap key => value
                                map.put(TAG_ITEMNAME, name);
                                map.put(TAG_QTY, qty);

                            dataList.add(map);
                        }
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    } else {
                        Log.e("JSON Data", "Didn't receive any data from server!");
                    }
            return null;

            }

            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                webservicePG.setVisibility(View.GONE);


                lv.setAdapter(adapter);

            }
        }

日志猫

03-17 12:17:17.087: E/AndroidRuntime(342): java.lang.NullPointerException
03-17 12:17:17.087: E/AndroidRuntime(342):  at com.winwrench.pos.fragments.FragmentLoadtransferAddon$AsyncCallWS.onPreExecute(FragmentLoadtransferAddon.java:110)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.os.AsyncTask.execute(AsyncTask.java:391)
03-17 12:17:17.087: E/AndroidRuntime(342):  at com.winwrench.pos.fragments.FragmentLoadtransferAddon.onActivityCreated(FragmentLoadtransferAddon.java:59)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.Fragment.performStart(Fragment.java:1521)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1889)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.Fragment.performStart(Fragment.java:1530)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.os.Handler.handleCallback(Handler.java:587)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.os.Looper.loop(Looper.java:123)
03-17 12:17:17.087: E/AndroidRuntime(342):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-17 12:17:17.087: E/AndroidRuntime(342):  at java.lang.reflect.Method.invokeNative(Native Method)
03-17 12:17:17.087: E/AndroidRuntime(342):  at java.lang.reflect.Method.invoke(Method.java:507)
03-17 12:17:17.087: E/AndroidRuntime(342):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-17 12:17:17.087: E/AndroidRuntime(342):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-17 12:17:17.087: E/AndroidRuntime(342):  at dalvik.system.NativeStart.main(Native Method)

最佳答案

NPE 发生在代码的以下行:

webservicePG.setVisibility(View.VISIBLE);

您在以下行启动 webservicePG:

webservicePG = (ProgressBar) rootView.findViewById(R.id.daystart_form_progressBar1);

因此,请确保 loadtransferaddon.xml 内有 id = daystart_form_progressBar1(区分大小写)

关于android - 在 Android Fragment 中实现 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22450603/

相关文章:

java - 为什么我的数据包没有发送到我的其他 Activity ?

android - 如何获取上次安装的应用程序的名称

android - getView() 和 getActivity() 有什么区别?

Android 开发 - fragment 中 AsyncTask 的错误实现?

ImageView 上的 Android 进度条

java - 打印 float

android - 如何将 onClickListener 添加到 ListView 行中的不同项目

android - 重新启动时 fragment 内部的 GLSurfaceView 不呈现

android - 如何在android中的AsyncTask中使用进度对话框

Android:如何在首选项屏幕中删除边距/填充