如何在android中的json数据上显示ImageView上的图像

时间:2012-06-04 16:57:02

标签: java android android-layout

我正在获取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>

3 个答案:

答案 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

http://codehenge.net/blog/2011/06/android-development-tutorial-asynchronous-lazy-loading-and-caching-of-listview-images/

Android Out of Memory error with Lazy Load images

Android lazy loading images class eats up all my memory

Lazy Load images on Listview in android(Beginner Level)?

Lazy load of images in ListView