Android 从通用图像加载器获取位图

Android 从通用图像加载器获取位图,android,bitmap,universal-image-loader,Android,Bitmap,Universal Image Loader,我正在尝试使用库获取位图资源。我重写了onLoadComplete()方法,如下所示: loader.displayImage(thumbnail.get(position), hold.ivThumbnailReflection, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String arg0, View arg1) { /

我正在尝试使用库获取位图资源。我重写了onLoadComplete()方法,如下所示:

loader.displayImage(thumbnail.get(position), hold.ivThumbnailReflection, options, new ImageLoadingListener() {

        @Override
        public void onLoadingStarted(String arg0, View arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLoadingComplete(String urlLink, View arg1, Bitmap loadedImage) {

            Log.i("loading complete","loading complete "+loadedImage);
            hold.ivThumbnail.setImageBitmap(loadedImage);


        }

        @Override
        public void onLoadingCancelled(String arg0, View arg1) {
            // TODO Auto-generated method stub

        }
    });
图像在
ivThumbnailReflection
视图中设置,但
ivThumbnailReflection
视图中没有图像。当我为LoadeImage打印对象时,我得到一个格式为-android.graphics的字符串。Bitmap@4170f1d0.

我做错了什么?请帮忙

编辑:初始化UIL的选项:

options = new DisplayImageOptions.Builder()
.cacheOnDisc(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();

请尝试使用处理程序或runOnUiThread(..)方法在ui线程中设置位图,如下所示:

handler..post(new Runnable() { // handler must be initialized in UI thread

            @Override
            public void run() {
                hold.ivThumbnail.setImageBitmap(loadedImage);

            }
});
或者尝试使用runOnUiThread()方法,如下所示:

runOnUiThread(new Runnable() {

            @Override
            public void run() {
                 hold.ivThumbnail.setImageBitmap(loadedImage);
            }
        });

为什么不只使用此选项,而使用complete:

imageLoader.displayImage(imageUri, imageView);
还是用这个

imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() 
{
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) 
    {
         // Do whatever you want with Bitmap
    }
});

确保在主/UI线程中创建选项

否则,使用处理程序分配扩展您的
选项的初始化

options = new DisplayImageOptions.Builder()
  .cacheOnDisc(true)
  .bitmapConfig(Bitmap.Config.RGB_565)
  .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
  .handler(yourHandler)
  .build();

其中,
yourHandler
应该在主/UI线程中创建。

尝试使用
loadImageSync(字符串uri)
。它提供位图

如果您想从位图绘制

Drawable d = new BitmapDrawable(getResources(),imageLoader.loadImageSync(url);

此代码必须对您有所帮助

public class CreateNotificationActivity extends AppCompatActivity {

    private NetworkImageView mNetworkImageView;
    private ImageLoader mImageLoader;
    Bitmap bit;

    String url = "http://www.whitegadget.com/attachments/pc-wallpapers/145032d1392006652-nature-wallpaper-nature-picture.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_notification);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView1);

        //bit = BitmapFactory.decodeResource(getResources(), R.drawable.bgd);

        //Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bgd);

        mImageLoader = CustomVolleyRequestQueue.getInstance(this.getApplicationContext())
                .getImageLoader();

        Bitmap bitmap =mImageLoader.get(url, ImageLoader.getImageListener(mNetworkImageView,
                R.mipmap.ic_launcher, R.drawable.icon)).getBitmap();



        Button btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createNotification();
            }
        });


    }

    @Override
    protected void onStart() {
        super.onStart();

        mImageLoader = CustomVolleyRequestQueue.getInstance(this.getApplicationContext())
                .getImageLoader();

        bit =mImageLoader.get(url, ImageLoader.getImageListener(mNetworkImageView,
                R.mipmap.ic_launcher, R.drawable.icon)).getBitmap();


    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void createNotification()
    {



        bit = BitmapFactory.decodeResource(getResources(), R.drawable.bgd);

        mImageLoader.get(url, new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {
                bit =mImageLoader.get(url, ImageLoader.getImageListener(mNetworkImageView,
                        R.mipmap.ic_launcher, android.R.drawable
                                .ic_dialog_alert)).getBitmap();

                Intent intent = new Intent(getApplicationContext(),NotificationReceiverActivity.class);
                PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), (int) System.currentTimeMillis(), intent, 0);


                Notification noti = new Notification.Builder(getApplicationContext())
                        .setContentTitle("Mail Notification")
                        .setContentText("5 new unread messages")
                        .setSmallIcon(R.drawable.bgd)
                        .setStyle(new Notification.BigPictureStyle().bigPicture(bit))
                        .setAutoCancel(true)
                        .setContentIntent(pIntent).build();


                NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

                noti.flags |= Notification.FLAG_AUTO_CANCEL;

                notificationManager.notify(0,noti);

                Log.i("LOG>>>>>>>>>>>>>>>>>>>","inside the on response");
            }

            @Override
            public void onErrorResponse(VolleyError volleyError) {
                bit = BitmapFactory.decodeResource(getResources(), R.drawable.bgd);
                Log.i("LOG>>>>>>>>>>>>>>>>>>>","inside the errror response");


            }
        });

//        bit =mImageLoader.get(url, ImageLoader.getImageListener(mNetworkImageView,
//                R.mipmap.ic_launcher, android.R.drawable
//                        .ic_dialog_alert)).getBitmap();

    }

}

此处LoadeImage是您需要的位图是否确定已分配
ivThumbnail
且不为空?@Antonio如果IVThumnail为空,则在运行时此代码行将出现空指针异常我已分配IVThumnail-holder.IVThumnail=(ImageView)convertView.findViewById(R.id.ivCarousel);使用holder类,您还可以提供如何初始化
选项
。我需要设置图像两次。displayImage()确实只显示了一次图像。要显示第二个图像,我需要在第二种类型上使用位图。您将以位图形式获取LoadeImage,您可以将此图像用于第二个图像。我已尝试使用hold.ivThumbnail.setImageBitmap(LoadeImage);。但它似乎不起作用,然后您必须检查此链接以解决您的问题:如果我只有位图和imageview,没有url,我可以使用Universal image loader吗?如果选项处理程序分配正确,库应该自己做。