我想通過傳遞一個url加載多個圖像。不像本教程http://www.learn2crack.com/2014/06/android-load-image-from-internet.html 其中只有一個圖像被下載並使用img.setImageBitmap(image)查看;我的問題是我怎麼能發送網址到一個方法加載該網址的圖像和方法返回一個圖像,然後我在imageview中顯示它。然後我傳遞給它一些其他的網址,並獲得圖像作爲迴應,並在其他一些imageview中顯示它。如何在AsyncTask中加載多個圖像
2
A
回答
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
您可以使用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;
}
}
相關問題
- 1. 在加載中加載多個圖像
- 2. 使用AsyncTask加載圖像
- 3. Android RecycleView AsyncTask加載圖像
- 4. 在Android中加載多個圖像
- 5. 如何在使用asynctask加載圖像後調整TextView大小
- 6. 如何從AsyncTask中的html加載圖像
- 7. OpenCV:加載多個圖像
- 8. 在android中使用AsyncTask下載圖像
- 9. 如何在Jupyter筆記本中加載多個圖像?
- 10. 如何在Actionscript 3.0中加載多個大圖像和視頻?
- 11. 如何使用asyncTask從資源加載圖像
- 12. 在多視圖中加載多個外部圖像和js codeigniter
- 13. 如何同時加載許多圖像?
- 14. 如何在FULL圖像加載時進行圖像加載? jquery
- 15. 如何在加載大圖像時顯示加載圖像?
- 16. 如何在d3中加載圖表後隱藏加載圖像?
- 17. 在Asynctask中加載動畫
- 18. 如何在Java中加載大圖像
- 19. 如何在apex.execute中加載圖像
- 20. 如何在javafx中加載圖像
- 21. 如何在angular2中加載圖像
- 22. 如何在Java中加載DICOM圖像?
- 23. 如何在J2ME中加載圖像?
- 24. 如何在Android中加載圖像?
- 25. 如何在uitableview中加載圖像?
- 26. 如何在textview中加載圖像?
- 27. 如何在PHP中加載圖像
- 28. 如何在Android中預加載圖像
- 29. 如何在飛鏢中加載圖像
- 30. 如何位圖加載更多然後一個圖像(柔性)
你真的想這樣做的序列,而不是在並行?您可以讓一個AsyncTask獲取一個URL數組,並在一個任務中獲取所有圖像。或者你可以啓動多個AsyncTasks,每個提取一個圖像。你的問題很含糊,因爲你似乎在問如何執行基本的流量控制(for循環等)。你到目前爲止嘗試了什麼? – JHH
@JHH我想要做的順序 – Beginner
@JHH我問這個問題http://stackoverflow.com/questions/29469428/image-does-not-loaded-and-throwingjava-net-malformedurlexception但因爲它重複了數字的AsyncTask被寫入下載每個圖像,但我只需要一個任務做下載多個圖像 – Beginner