2017-04-13 3 views
1

私はdoInBackgroundのURLのデータを解析し、値をonPostExecuteのUIスレッドに設定しています。だから私の配列のArrayListは、グローバル変数である:私はdoInBackgroundでHTMLを解析し、グローバルArrayListに値を追加するので、私はonPostExecuteのArrayList()へのArrayListを返すときが空である、今Asyncatsk doInBackground空を返します<String> to onPostExecute

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

ここ

は私のコードは次のとおりです。

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() 
    { 

    } 
} 
+0

あなたはdoInBrackgroundに追加したコールバックの中にいるので、メソッドの最後にすぐにArrayList を返しています(まだ空です)。コードを動作させるには、 'Ion.with ...'の部分を同期メソッドに変換する必要があります。私はあなたが使用しているライブラリのドキュメントをチェックしました。そして、 'setCallback()'の代わりに 'get()'を使って同期要求を使う必要があります。 [here](https://github.com/koush/ion#blocking-on-requests) – MatPag

+0

を読んでください。@MatPag私はイオン交換の方法を教えてください。どのようにsetCallback()の代わりにget()を使用する – smiljka

答えて

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; 
} 
+0

これはうまくいきました。ありがとうMatPagちょうど私の日を救う!!!! – smiljka

+0

@smiljka聞いてよかった!!あなたがそれに満足すれば答えを受け入れることができます;) – MatPag

0

doInBackground()メソッドの値を返す前にarrayListのサイズを確認してください!

+0

私はチェクシングし、返す前にまだ0ですが、私は値を追加するときにチェックしました – smiljka

0

Inoは非同期の結果を提供します。つまり、Inoリクエストが完了するまで現在のスレッドを一時停止/ブロックする必要があります。

ただし、この場合はAsyncTaskを使用する必要はありません。 onPostExecuteからコードをコールバックハンドラに移動するだけで済みます。

この場合、非同期HTMLを解析する(今はしない)場合は、Inoコールバックハンドラからasynctaskを実行する必要があります。

+0

イオン要求終了plsをブロックする現在のUIスレッドを一時停止するhoを説明できますか? – smiljka

0

問題は "帰りのarraylist"とあなたreqeustです。

あなたのリクエストは非同期です:

実行ステップ: まず:

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

2番目のリクエスト:

return arraylist 

最終ステップ:

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

要求は非同期であるため、

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

が返されます。あなたを助けるために

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

希望:

あなたはにリターンコードを移動することができます。

関連する問題