简体   繁体   中英

ArrayList in onPostExecute(AsyncTask) on Fragment is empty

I am using ArrayList in onPostExecute(AsyncTask) on Fragment.

The problem is that arrivalInfoArrayList is empty after I executed AsyncTask.

I tried to use

1)

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

2)

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

            }
        });

But it did not work. How can I solve this? This is my code.

    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);

First thing first ,you should do such while loop computation in doInBackround() . Also did you try to print array list size in logs or tried debugging the execution to check if there is any data get added in your array list? If not then you should have done this basic home work.

Assuming arrivalUrl is an actual URL string and the intent is to fetch/parse the URL response then you'll need to get an input stream to the URL endpoint as in below. But you must do this in background - doInBackground .

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

and close the stream at the end

is.close();

and wrap everything with a try-block for possible exceptions.

Have the doInBackground return the arraylist and process it in onPostExecute .

Here's an answer which demonstrates this - you're not too far from it - basically turn your onPostExecute into doInBackground and return the ArrayList: https://stackoverflow.com/a/6343299/2711811

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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