0

次のコードを使用して、サーバーからリモート イメージを読み込もうとしています。

imageViewClient = (ImageView) findViewById(R.id.imageViewClient);
try 
{
    URL thumb_u = new URL(c.getImage());
    Drawable thumb_d = Drawable.createFromStream(thumb_u.openStream(), "src");
    imageViewClient.setImageDrawable(thumb_d);                      

}
catch (Exception e) 
{

}

画像は正常に表示されていますが、コードを新しいスレッドに入れると、画像が読み込まれません。

コードは次のとおりです。

new Thread() 
{
    @Override
    public void run()
    {
            //** Set imageview url
            try {
                URL thumb_u = new URL(c.getImage());
                Drawable thumb_d = Drawable.createFromStream(
                    thumb_u.openStream(), "src");

                imageViewClient.setImageDrawable(thumb_d);                      

            }
            catch (Exception e) {

            }

    }
}.start();

画像が読み込まれません。なぜですか?

4

4 に答える 4

3

この方法でスレッド内の UI を変更することはできません。asyncTaskまたは メソッドを使用runOnUiThreadして、ユーザー インターフェイスを適切に変更する必要があります。またはさらに良いことに、handlerこの投稿のように

于 2013-02-01T20:56:50.457 に答える
1

バックグラウンド スレッドから次のように変更するには、 Activity.runOnUiThreadを使用する必要があります。

 @Override
  public void run() {
     //** Set imageview url
     try {
        URL thumb_u = new URL(c.getImage());
         Drawable thumb_d = Drawable.createFromStream(
                              thumb_u.openStream(), "src");                      

        Your_current_Activity.this.runOnUiThread(new Runnable() {
        public void run() {
         // Chnage imageView bg here
        imageViewClient.setImageDrawable(thumb_d); 
        }
    });
       }
     catch (Exception e) {

    }
于 2013-02-01T20:55:36.090 に答える
0

このようにスレッド化を手動で処理しようとする代わりに (別のスレッドから UI を更新できないというこのような問題に遭遇する場合)、この記事AsyncTaskを見て、既にいくつかあるようなものを使用することを検討してください。このインフラストラクチャの適切な場所であり、実際にはまさにあなたのユースケースの例があります:

public void onClick(View v) {
  new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask {
     protected Bitmap doInBackground(String... urls) {
         return loadImageFromNetwork(urls[0]);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
     }
 }
于 2013-02-01T20:59:12.463 に答える
0

Web から画像をダウンロードしてキャッシュする単純な AsyncTask を次に示します。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.ImageView;

/**
 * Downloads an image from a URL and saves it to disk, to be referenced if the
 * same URL is requested again
 */
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

    private static final String LOG = DownloadImageTask.class.getSimpleName();

    ImageView mImageView;

    public static final String IMAGE_CACHE_DIRECTORY = YourApplication
            .getContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES)
            .getAbsolutePath();

    public DownloadImageTask(ImageView bmImage) {
        this.mImageView = bmImage;

        // TODO set to default "loading" drawable
        mImageView.setImageBitmap(null);
    }

    @Override
    protected Bitmap doInBackground(String... urls) {

        String url = urls[0];

        Log.v(LOG, "url: " + url);

        String filename = url.substring(url.lastIndexOf("/") + 1, url.length());

        Log.v(LOG, "filename: " + filename);

        Bitmap bmp = getBitmapFromDisk(filename);

        if (bmp == null) {
            try {
                InputStream in = new java.net.URL(url).openStream();
                bmp = BitmapFactory.decodeStream(in);
                writeBitmapToDisk(filename, bmp);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
        }

        return bmp;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        mImageView.setImageBitmap(result);
    }

    public boolean writeBitmapToDisk(String imageid, Bitmap bmp) {
        boolean saved = false;

        File path = new File(IMAGE_CACHE_DIRECTORY);
        path.mkdirs();
        File imageFile = new File(path, imageid);
        FileOutputStream imageOS = null;
        try {
            imageOS = new FileOutputStream(imageFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        saved = bmp.compress(Bitmap.CompressFormat.JPEG, 95, imageOS);
        return saved;
    }

    public Bitmap getBitmapFromDisk(String imageid) {
        Bitmap bmp = BitmapFactory.decodeFile(IMAGE_CACHE_DIRECTORY + "/"
                + imageid);
        return bmp;
    }

}

次のように実装されています。

new DownloadImageTask(mImageView).execute("https://www.google.com/images/srpr/logo3w.png");
于 2013-02-01T23:03:19.960 に答える