2016-10-26 9 views
2

リンクを使用して、文字列[]からBitmap []を取得したいとします。しかし、これは私が望むように動作しません。私はこれを持っていますメソッド:ピカソからビットマップ配列に画像を取得するには

private Bitmap[] getBitmaps(String[] images){ 
    ArrayList<Bitmap> temp = new ArrayList<>(); 
    for(int i = 0; i < images.length; i++){ 
     ImageView img = new ImageView(getContext()); 
     FrameLayout.LayoutParams x = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     img.setLayoutParams(x); 
     Picasso.with(getContext()).load(MainPostAdapter.USER_URL+images[i]+".png").into(img, new Callback() { 
      @Override 
      public void onSuccess() { 
       temp.add(BitmapRes.drawableToBitmap(img.getDrawable())); 
       movableBackgroundContainer.removeView(img); 
      } 

      @Override 
      public void onError() { 

      } 
     }); 
     movableBackgroundContainer.addView(img); 
    } 
    return temp.toArray(new Bitmap[temp.size()]); 
} 

問題は、onSuccess関数の後にリストにビットマップを追加するため、null配列を取得します。どのようにonSuccessがビットマップを追加してから戻るまで待つことができますか?

答えて

4

ピカソのget()の機能は、あなたが探しているものです。画像をImageViewに読み込むのではなく、ビットマップをダウンロードします。ピカソのget()メソッドはメインスレッドで呼び出すことができません。私の例では、AsyncTaskを使って別のスレッドでイメージをダウンロードしています。

String[] images = new String[] {"http://path.to.image1.jpg", "http://path.to.image2.jpg"}; 
    new AsyncTask<String[], Void, List<Bitmap>>() { 
     @Override 
     protected List<Bitmap> doInBackground(String[]... params) { 
      try { 
       List<Bitmap> bitmaps = new ArrayList<Bitmap>(); 
       for (int i = 0; i < params[0].length; ++i) { 
        bitmaps.add(Picasso.with(getActivity()).load(params[0][i]).get()); 
       } 
       return bitmaps; 
      } catch (IOException e) { 
       return null; 
      } 
     } 

     @Override 
     public void onPostExecute(List<Bitmap> bitmaps) { 
      if (bitmaps != null) { 
       // Do stuff with your loaded bitmaps 
      } 
     } 
    }.execute(images); 
1

整数がimages.lengh()に等しくなるまで、成功するたびに整数を増やすことができます。これをループでチェックすることができます。ループ内では、リターン内のif節があります。

 @Override 
      public void onSuccess() { 
       temp.add(BitmapRes.drawableToBitmap(img.getDrawable())); 
       movableBackgroundContainer.removeView(img); 
       currentSuccess++; 
      } 

とリターンのために:ループでは

例えば

int currentSuccess = 0; 

while(true){ 
    if(currentSuccess == images.length){ 
     return temp.toArray(new Bitmap[temp.size()]); 
    } 
} 

お役に立てば幸いです。

関連する問題