0

この素敵なコード スニペットを見つけました: Android, Make an image at a URL equal to ImageView's image

私が作成しようとしている小さな「スクリーンスライダー」アプリに実装しようとしました。ビットマップを作成しようとすると、同じスレッドでネットワーク呼び出しを行うことができないという例外がスローされます。次に、イメージビューを埋めるために新しいスレッドを作成しようとしましたが、ビュー階層を作成した元のスレッドのみがそのビューにアクセスできると表示されます。

次はどこへ向かえばいいのかわからない。これは Fragment を拡張するクラス内にあるため、ViewGroup への「直接アクセス」はありません。

これは、新しいスレッドのコードです。

public class MyThread implements Runnable {

    ViewGroup vg;
   public MyThread(ViewGroup parameter) {
       this.vg = parameter;
   }

   public void run() {
       try {                      
              Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL("http://static.adzerk.net/Advertisers/11239ce559004d9a8e16fe2790630628.png").getContent());
              ImageView i = (ImageView)vg.findViewById(R.id.image);
              i.setImageBitmap(bitmap); 
            } catch (MalformedURLException e) {
              e.printStackTrace();
            } catch (IOException e) {
              e.printStackTrace();
            }
   }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the layout containing a title and body text.
    ViewGroup rootView = (ViewGroup) inflater
            .inflate(R.layout.fragment_screen_slide_page, container, false);

    // Set the title view to show the page number.
    ((TextView) rootView.findViewById(android.R.id.text1)).setText(
            getString(R.string.title_template_step, mPageNumber + 1));

    Runnable r = new MyThread(rootView);
    new Thread(r).start();

    return rootView;
}

そのビットマップオブジェクトを新しいスレッドで埋めてから、UIスレッドに戻してイメージビューを埋める方法について、誰かが提案できますか?

ティア。

4

1 に答える 1

0

私はこれを機能させるためにasynctaskを使用することになりました:

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    private int data = 0;

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(Integer... params) {
        data = params[0];
        Bitmap bitmap = null;
        try {                     
              bitmap = BitmapFactory.decodeStream((InputStream)new URL("http://static.adzerk.net/Advertisers/11239ce559004d9a8e16fe2790630628.png").getContent());
            } catch (MalformedURLException e) {
              e.printStackTrace();
            } catch (IOException e) {
              e.printStackTrace();
            }
        return bitmap;
    }

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}
于 2013-06-14T03:36:04.913 に答える