AsyncTask doInBackground return empty ArrayList<string> to onPostExecute

时间:2017-04-13 14:55:27

标签: android android-asynctask

I am parsing data from URL in doInBackground and setting values to UI thread in onPostExecute. So my array ArrayList is global variable:

 ArrayList<String> arraylist=new ArrayList<String>();

Now, i parse html in doInBackground and add values to global ArrayList , so when i return arraylist to onPostExecute ArrayList() is empty

Here is my code:

  ArrayList<String> arraylist=new ArrayList<String>(); // global

  new readtextfile21().execute(rezultat1); 

 public class readtextfile21 extends AsyncTask<String, ArrayList<String>, ArrayList<String>> {

    @Override
    protected ArrayList<String> doInBackground(String... params)
    {
        Ion.with(getActivity().getApplicationContext())

                .load(rezultat1)

                .asString()

                .setCallback(new FutureCallback<String>() {
                    @Override
                    public void onCompleted(Exception e, String result) {

                        String htmlStringSlike = result.substring(result.indexOf("<!-- BEGIN .shortcode-content -->"), result.length());
                        int startPositionSlika=htmlStringSlike.indexOf("<div class=\"shortcode-content\">");
                        int endPositionSlika=startPositionSlika+"<div class=\"shortcode-content\">".length();

                        while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf("<!-- END .shortcode-content -->") < 0) {
                            endPositionSlika++;
                        }
                        htmlStringSlike=htmlStringSlike.substring(startPositionSlika,endPositionSlika);

                        while(htmlStringSlike.length()>0){

                            startPositionSlika = htmlStringSlike.indexOf("src=");
                            if(startPositionSlika>0) {

                                String slikaUTekstu=null;
                                startPositionSlika+= "src=".length() + 1;

                                endPositionSlika = startPositionSlika;

                                while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpg") < 0 &&  htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpeg") < 0 && htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".png") < 0) {
                                    endPositionSlika++;
                                }

                                slikaUTekstu = htmlStringSlike.substring(startPositionSlika, endPositionSlika);

                                htmlStringSlike=htmlStringSlike.substring(endPositionSlika);

                                arraylist.add(slikaUTekstu);// when i log values are here
                            }
                            else break;

                        }
                    }

                });

        return arraylist;

    }
    @Override
    protected void onPostExecute(ArrayList<String> result) {

        System.out.println("u onpost" + result);

        for(int i=0;i<result.size() ;i++){ // result size here is 0???

            slikaTv[i] = (ImageView) v.findViewById(nizSlikaID[i]);

            Picasso.with(getActivity()).load(result.get(i)) // programski slika u dodati layout
                    .into(slikaTv[i]);

            v.findViewById(mLayoutIdArray[i]).setVisibility(View.VISIBLE);
        }
    }
    protected void onProgressUpdate() {

    }
    protected void onPreExecute()
    {

    }
}

4 个答案:

答案 0 :(得分:0)

请在doInBackground()方法中返回值之前检查arrayList的大小!

答案 1 :(得分:0)

Ino提供异步结果。这意味着您需要暂停/阻止当前线程,直到Ino请求完成。

但在这种情况下使用AsyncTask完全没必要。您可以将代码从onPostExecute移动到回调处理程序。

如果你想要异步解析HTML(你现在不这么做),你需要从Ino回调处理程序运行asynctask。

答案 2 :(得分:0)

使用下面的代码更改您的doInBackground()方法,抱歉,但我从未使用过这个库,所以我可能会犯一些错误。

@Override
protected ArrayList<String> doInBackground(String... params)
{
    try {
        String result = Ion.with(getActivity().getApplicationContext())
                .load(params[0])
                .asString()
                .get();
    } catch (Exception e){
        e.printStackTrace();
    }

    if (result != null){
        String htmlStringSlike = result.substring(result.indexOf("<!-- BEGIN .shortcode-content -->"), result.length());
        int startPositionSlika=htmlStringSlike.indexOf("<div class=\"shortcode-content\">");
        int endPositionSlika=startPositionSlika+"<div class=\"shortcode-content\">".length();

        while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf("<!-- END .shortcode-content -->") < 0) {
            endPositionSlika++;
        }
        htmlStringSlike=htmlStringSlike.substring(startPositionSlika,endPositionSlika);

        while(htmlStringSlike.length()>0){

            startPositionSlika = htmlStringSlike.indexOf("src=");
            if(startPositionSlika>0) {

                String slikaUTekstu=null;
                startPositionSlika+= "src=".length() + 1;

                endPositionSlika = startPositionSlika;

                while (htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpg") < 0 &&  htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".jpeg") < 0 && htmlStringSlike.substring(startPositionSlika, endPositionSlika).indexOf(".png") < 0) {
                    endPositionSlika++;
                }

                slikaUTekstu = htmlStringSlike.substring(startPositionSlika, endPositionSlika);

                htmlStringSlike=htmlStringSlike.substring(endPositionSlika);

                arraylist.add(slikaUTekstu);// when i log values are here
            } else { 
                break;
            }
        }
    }

    return arraylist;
}

答案 3 :(得分:0)

问题是&#34;返回arraylist&#34;而且你需要。

您的请求是异步的:

执行步骤: 第一:请求

Ion.with(getActivity().getApplicationContext())
            .load(rezultat1)
            .asString()
            .setCallback(new FutureCallback<String>() {...}

第二:

return arraylist

最后一步:

public void onCompleted(Exception e, String result) {...}

因为请求是异步的:

setCallback(new FutureCallback<String>() {...}

将在返回后执行;

您可以将返回代码移至:

while(htmlStringSlike.length()>0){
    ...
}
return arraylist;

希望能帮到你。