2015-04-07 51 views
2

我想通過傳遞一個url加載多個圖像。不像本教程http://www.learn2crack.com/2014/06/android-load-image-from-internet.html 其中只有一個圖像被下載並使用img.setImageBitmap(image)查看;我的問題是我怎麼能發送網址到一個方法加載該網址的圖像和方法返回一個圖像,然後我在imageview中顯示它。然後我傳遞給它一些其他的網址,並獲得圖像作爲迴應,並在其他一些imageview中顯示它。如何在AsyncTask中加載多個圖像

+0

你真的想這樣做的序列,而不是在並行?您可以讓一個AsyncTask獲取一個URL數組,並在一個任務中獲取所有圖像。或者你可以啓動多個AsyncTasks,每個提取一個圖像。你的問題很含糊,因爲你似乎在問如何執行基本的流量控制(for循環等)。你到目前爲止嘗試了什麼? – JHH

+0

@JHH我想要做的順序 – Beginner

+0

@JHH我問這個問題http://stackoverflow.com/questions/29469428/image-does-not-loaded-and-throwingjava-net-malformedurlexception但因爲它重複了數字的AsyncTask被寫入下載每個圖像,但我只需要一個任務做下載多個圖像 – Beginner

回答

1

好吧,假設你出於某種原因想要一個接一個地依次獲取圖像,而不是並行,並假設你的URL在列表,數組等等,修改教程示例,以便onPostExecute調用您的活動中的一種方法,無論是在回調接口中還是在您的類本身中定義的,並且每次迭代都會從列表中選取一個元素,並在前一個元素完成時啓動新的LoadImage作業。

實施例(未測試的)代碼:

public class MainActivity extends Activity { 
    Button load_img; 
    ImageView img; 
    Bitmap bitmap; 
    ProgressDialog pDialog; 
    private List<String> mURLs = new LinkedList<String>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    load_img = (Button)findViewById(R.id.load); 
    img = (ImageView)findViewById(R.id.img); 
    load_img.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     mURLs.add("http://www.learn2crack.com/wp-content/uploads/2014/04/node-cover-720x340.png"); 
     mURLs.add("some-other-URL"); 

     loadNext(); 
     } 
    }); 

    private void loadNext() { 
     String url = mURLs.remove(); 
     if (url != null) { 
      new LoadImage().execute(url); 
     } 
    } 
    } 
    private class LoadImage extends AsyncTask<String, String, Bitmap> { 
    @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(MainActivity.this); 
      pDialog.setMessage("Loading Image ...."); 
      pDialog.show(); 
    } 
     protected Bitmap doInBackground(String... args) { 
     try { 
       bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent()); 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } 
     return bitmap; 
     } 
     protected void onPostExecute(Bitmap image) { 
     if(image != null){ 
      img.setImageBitmap(image); 
      pDialog.dismiss(); 
     }else{ 
      pDialog.dismiss(); 
      Toast.makeText(MainActivity.this, "Image Does Not exist or Network Error", Toast.LENGTH_SHORT).show(); 
     } 

     loadNext(); 
     } 
    } 
} 

在這個例子中我將圖像設置到重複相同的ImageView這顯然是沒有意義的。您顯然必須通過將imageview作爲參數發送到任務,或者將圖像視圖(或其相應的R.id.xxx ID和相應的findById)保存到數組中,以跟蹤哪個圖像會放到哪個圖像視圖上,或者保持一個櫃檯,或....有一百萬種方法來解決這個問題。

另一種方法是將數組發送到AsyncTask,並使doInBackground簡單地通過for-loop或類似方法在數組上循環。

但請注意,更好的方法可能是將任務實際並行化,以確保充分利用可用網絡帶寬來並行獲取圖像。

+0

其實我正面臨着這兩個問題:1)我無法將視圖發送給asyntask,2)將加載的圖像設置爲不同的圖像視圖。所以請你解決這個問題 – Beginner

+0

而不是在onPostExecute裏面的imageview上設置圖像,像在我的例子中那樣調用封閉活動中的一個方法,但是讓這個方法成爲一個負責分配圖像給圖像瀏覽器的方法。例如,將「image」作爲參數傳遞給loadNext()。然後,AsyncTask根本不需要了解圖像瀏覽,並且可以將該邏輯放在它之外。 – JHH

0

您可以使用android Volley Library下載圖像。

volley.jar庫項目

Image Request using Volleyhttps://developer.android.com/training/volley/request.html#request-image

如果你想顯示在GridView/ListView的圖像。

使用

<com.android.volley.toolbox.NetworkImageView 
    android:id="@+id/networkImageView" 
    android:layout_width="150dp" 
    android:layout_height="170dp" 
    android:layout_centerHorizontal="true" /> 
在grid_item.xml或list_item.xml

在你ListAdapter的getView

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Get the NetworkImageView that will display the image. 
    mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView); 

    // Get the ImageLoader through your singleton class. 
    mImageLoader = MySingleton.getInstance(this).getImageLoader(); 

    // Set the URL of the image that should be loaded into this view, and 
    // specify the ImageLoader that will be used to make the request. 
    mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader); 
} 



private static MySingleton mInstance; 
private RequestQueue mRequestQueue; 
private ImageLoader mImageLoader; 
private static Context mCtx; 

private MySingleton(Context context) { 
    mCtx = context; 
    mRequestQueue = getRequestQueue(); 

    mImageLoader = new ImageLoader(mRequestQueue, 
      new ImageLoader.ImageCache() { 
     private final LruCache<String, Bitmap> 
       cache = new LruCache<String, Bitmap>(20); 

     @Override 
     public Bitmap getBitmap(String url) { 
      return cache.get(url); 
     } 

     @Override 
     public void putBitmap(String url, Bitmap bitmap) { 
      cache.put(url, bitmap); 
     } 
    }); 
} 

public static synchronized MySingleton getInstance(Context context) { 
    if (mInstance == null) { 
     mInstance = new MySingleton(context); 
    } 
    return mInstance; 
} 

public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     // getApplicationContext() is key, it keeps you from leaking the 
     // Activity or BroadcastReceiver if someone passes one in. 
     mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); 
    } 
    return mRequestQueue; 
} 

public <T> void addToRequestQueue(Request<T> req) { 
    getRequestQueue().add(req); 
} 

public ImageLoader getImageLoader() { 
    return mImageLoader; 
} 
}