繁体   English   中英

Fragment的onPostExecute(AsyncTask)中的ArrayList为空

[英]ArrayList in onPostExecute(AsyncTask) on Fragment is empty

我在Fragment的onPostExecute(AsyncTask)中使用ArrayList。

问题是我执行AsyncTask后, arrivalInfoArrayList为空。

我尝试使用

1)

getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //Code for the UiThread
    }
});

2)

new Handler().post(new Runnable() {
            @Override
            public void run() {

            }
        });

但这没有用。 我该如何解决? 这是我的代码。

    arrivalAsync = new ArrivalAsync() {
        @Override
        protected void onPostExecute(String arrivalUrl) {
            try {
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(true);
                XmlPullParser xpp = factory.newPullParser();

                xpp.setInput(new StringReader(arrivalUrl));
                int eventType = xpp.getEventType();
                while(eventType != XmlPullParser.END_DOCUMENT) {
                    if(eventType == XmlPullParser.START_DOCUMENT) {

                    } else if(eventType == XmlPullParser.START_TAG) {
                        String tagName = xpp.getName();

                        switch (tagName) {
                            case "arsId":
                                bl_arsId = true;
                                break;
                            case "firstTm":
                                bl_firstTm = true;
                                break;
                            case "lastTm":
                                bl_lastTm = true;
                            case "stNm":
                                bl_stNm = true;
                                break;
                        }
                    } else if(eventType == XmlPullParser.TEXT) {

                        if(bl_arsId) {
                            arsId = xpp.getText();
                            arrivalInfo.setArsId(arsId);
                            bl_arsId = false;
                        }

                        if(bl_firstTm) {
                            firstTm = xpp.getText();
                            arrivalInfo.setFirstTm(firstTm);
                            bl_firstTm = false;
                        }

                        if(bl_lastTm) {
                            lastTm = xpp.getText();
                            arrivalInfo.setLastTm(lastTm);
                            bl_lastTm = false;
                        }

                        if(bl_stNm) {
                            stNm = xpp.getText();
                            arrivalInfo.setStNm(stNm);
                            bl_stNm = false;
                        }


                    } else if(eventType == XmlPullParser.END_TAG) {
                        String tagName = xpp.getName();

                        if(tagName.equals("itemList"))  {

                            arrivalInfoArrayList.add(arrivalInfo);

                            arrivalInfo = new ArrivalInfo();
                        }
                    }
                    eventType = xpp.next();

                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    };

arrivalAsync.execute(arrivalUrl);

首先,您应该在doInBackround()中进行while循环计算。 您是否还尝试在日志中打印阵列列表大小或尝试调试执行以检查阵列列表中是否添加了任何数据? 如果没有,那么您应该已经完成​​了基本的家庭作业。

假设arrivalUrl是一个实际的URL字符串,并且意图是获取/解析URL响应,那么您将需要获得输入流,到达URL端点,如下所示。 但是您必须在background- doInBackground执行此doInBackground

InputStream is = new URL(arrivalUrl).openConnection().getInputStream();
xpp.setInput(is, null);

并在最后关闭流

is.close();

并使用try块包装所有内容,以防可能出现异常。

doInBackground返回arraylist并在onPostExecute中对其进行onPostExecute

这是一个演示此问题的答案-您离它不太远-基本上将您的onPostExecute转换为doInBackground并返回ArrayList: https : doInBackground

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM