我正在获取json数据。在那个json我有一个图像的URL。现在我想在ImageView中显示该Image。我怎么能做到这一点?这是我的代码
class LoadInbox extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Home.this);
pDialog.setMessage("Loading Inbox ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
/**
* getting Inbox JSON
* */
protected String doInBackground(String... arg0) {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
JSONObject json = userFunctions.homeData();
Log.e("Data", json.toString());
// Check your log cat for JSON reponse
Log.d("Inbox JSON: ", json.toString());
try {
data = json.getJSONArray(TAG_DATA);
Log.d("inbox array: ", data.toString());
// looping through All messages
for (int i = 0; i < data.length(); i++) {
JSONObject c = data.getJSONObject(i);
// Storing each json item in variable
String profile_img = c.getString(TAG_PROFILE_IMG);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_PROFILE_IMG, profile_img);
// adding HashList to ArrayList
inboxList.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
// dismiss the dialog after getting all products
pDialog.dismiss();
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(
Home.this, inboxList,
R.layout.home_list_item, new String[] { TAG_PROFILE_IMG },
new int[] { R.id.profile_img2 });
// updating listview
setListAdapter(adapter);
}
});
}
这是我的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/profile_img2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="8dip"
android:paddingLeft="8dip"
android:paddingBottom="4dip" />
</RelativeLayout>
答案 0 :(得分:4)
因此,您需要创建另一个AsyncTask,给定URL将加载图像,并填充一些控件。我通常做这样的事情:
ImageView imageView = (ImageView)findById(R.id.blah);
new ImageLoader( person.getImageUri(), imageView, 128, 128 ).execute();
ImageLoader将是另一个AsyncTask,如下所示:
public class ImageLoader extends AsyncTask<URI,Integer,BitmapDrawable> {
private Uri imageUri;
private ImageView imageView;
private int preferredWidth = 80;
private int preferredHeight = 80;
public ImageLoader( URI uri, ImageView imageView, int scaleWidth, int scaleHeight ) {
this.imageUri = uri;
this.imageView = imageView;
this.preferredWidth = scaleWidth;
this.preferredHeight = scaleHeight;
}
public BitmapDrawable doInBackground(URI... params) {
if( imageUri == null ) return null;
String url = imageUri.toString();
if( url.length() == 0 ) return null;
HttpGet httpGet = new HttpGet(url);
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute( httpGet );
InputStream is = new BufferedInputStream( response.getEntity().getContent() );
try {
Bitmap bitmap = BitmapFactory.decodeStream(is);
if( preferredWidth > 0 && preferredHeight > 0 && bitmap.getWidth() > preferredWidth && bitmap.getHeight() > preferredHeight ) {
return Bitmap.createScaledBitmap(bitmap, preferredWidth, preferredHeight, false);
} else {
return bitmap;
}
} finally {
is.close();
}
}
}
public void onPostExecute( BitmapDrawable drawable ) {
imageView.setImageBitmap( drawable );
}
}
然后,通过创建自己的子类ListAdapter,可以在ListView中绑定图像时关闭此AsyncTask。所以你不得不放弃使用SimpleAdapter因为事情不再简单。这有很多优点,因此您只需加载正在显示的图像。这意味着从总数中加载了一个非常小的数字。此外,您的用户可以在图像加载之前查看数据,从而更快地访问数据。如果您在现有的AsyncTask中执行此操作,则会加载每个图像,并且用户必须等待每个图像完成才能向用户显示数据。有些东西可以通过这种方式得到改善。一个AsyncTask使用自己的线程,因此您可能会同时运行大量线程(10个或更多)。这可能会杀死许多客户端的服务器。您可以使用ExecutorService(即线程池)集中这些,但是您必须使用AsyncTask并实现自己的工具来从UI线程运行作业并将结果发布回UI线程。其次,每次用户滚动时,您的图像都会加载。为此我根据图像的URI实现了自己的缓存方案,所以我只加载一次图像并从缓存中返回。这里发布的代码太多了,但这些都是读者的练习。
另请注意,我没有回复onPostExecute()中的UI线程。那是因为AsyncTask为我做了这个,我没有必要再做,因为上面的代码显示。你应该删除那个额外的runnable并在onPostExecute()中内联代码。
答案 1 :(得分:1)
你可以尝试picasso非常容易使用并且效果很好。
Picasso.with(this.getActivity()).load(person.getImageUri()).into(imageView); // if person.getImageUri() has the url image loaded from json
就是这样。
答案 2 :(得分:0)
看起来你正在获得多个网址(如数组中)
1- Keep all the url in an hastable with key as url and value as image View.
2- Show your UI and with loading image.
3- create the other task download image one by one and update in the image view.
例如lazy imageloader ......
http://iamvijayakumar.blogspot.in/2011/06/android-lazy-image-loader-example.html
Android Out of Memory error with Lazy Load images
Android lazy loading images class eats up all my memory