6

jsonデータを取得しています。そのjsonには、画像のURLがあります。次に、その画像をImageViewに表示します。どうすればこれを達成できますか?これが私のコードです

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>
4

3 に答える 3

5

したがって、URLを指定すると画像が読み込まれ、コントロールにデータが入力される別のAsyncTaskを作成する必要があります。私は通常、次のようなことをします。

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でこれを行った場合、すべての画像をロードし、ユーザーはデータがユーザーに表示される前にすべての画像が終了するのを待つ必要があります。これによって改善できることがあります。1つのAsyncTaskは独自のスレッドを使用するため、一度に多数のスレッド(10以上)を実行する可能性があります。それは多くのクライアントであなたのサーバーを殺すことができます。ExecutorService(つまりスレッドプール)を使用してこれらを一元化できますが、AsyncTaskを使用して破棄し、UIスレッドからジョブを実行して結果をUIスレッドにポストバックする独自の機能を実装する必要があります。次に、ユーザーがスクロールするたびに画像が読み込まれます。このために、画像のURIに基づいて独自のキャッシュスキームを実装したので、画像を1回だけロードして、キャッシュから返します。ここに投稿するには少し多すぎるコードですが、これらは読者のための演習です。このために、画像のURIに基づいて独自のキャッシュスキームを実装したので、画像を1回だけロードして、キャッシュから返します。ここに投稿するには少し多すぎるコードですが、これらは読者のための演習です。このために、画像のURIに基づいて独自のキャッシュスキームを実装したので、画像を1回だけロードして、キャッシュから返します。ここに投稿するには少し多すぎるコードですが、これらは読者のための演習です。

また、onPostExecute()でUIスレッドにポストバックしていないことにも注意してください。これは、AsyncTaskが私のためにそれを行うためです。上記のコードが示すように、再度行う必要はありません。その余分な実行可能ファイルを削除し、onPostExecute()でコードをインライン化する必要があります。

于 2012-06-04T17:14:00.147 に答える
1

あなたはピカソを試すことができます本当に使いやすく、本当にうまくいきます。

Picasso.with(this.getActivity()).load(person.getImageUri()).into(imageView); // if person.getImageUri() has the url image loaded from json

以上です。

于 2014-09-06T07:28:16.823 に答える
0

見た目は複数のURLを取得しています(配列のように)

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. 

例として怠惰なイメージローダー......

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のメモリ不足エラー

Androidの遅延読み込み画像クラスはすべてのメモリを消費します

android(初心者レベル)のリストビューで画像を遅延ロードしますか?

ListViewでの画像の遅延読み込み

于 2012-06-04T17:05:51.680 に答える