java - 使用 ImageLoader 时出错,提示其未初始化

标签 java android adapter image-loading

我正在关注this tutorial 。我正在尝试创建一个简单的 ImageView 寻呼机。本教程之后的示例项目运行良好。但是,当我尝试在项目中使用相同的代码时,我收到 ImageLoader 未初始化错误。

详细的logcat:

03-19 13:30:02.290: E/AndroidRuntime(7716): FATAL EXCEPTION: main
03-19 13:30:02.290: E/AndroidRuntime(7716): java.lang.IllegalStateException: ImageLoader must be init with configuration before using
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.nostra13.universalimageloader.core.ImageLoader.checkConfiguration(ImageLoader.java:340)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:179)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.specialspots.specialspots.ImageSlideAdapter.instantiateItem(ImageSlideAdapter.java:84)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.specialspots.specialspots.ImageSlideAdapter.instantiateItem(ImageSlideAdapter.java:1)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.support.v4.view.ViewPager.populate(ViewPager.java:982)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:442)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.specialspots.specialspots.HomeFragment$RequestImgTask.onPostExecute(HomeFragment.java:278)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.specialspots.specialspots.HomeFragment$RequestImgTask.onPostExecute(HomeFragment.java:1)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.os.AsyncTask.finish(AsyncTask.java:631)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.os.Looper.loop(Looper.java:176)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at android.app.ActivityThread.main(ActivityThread.java:5419)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at java.lang.reflect.Method.invokeNative(Native Method)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at java.lang.reflect.Method.invoke(Method.java:525)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
03-19 13:30:02.290: E/AndroidRuntime(7716):     at dalvik.system.NativeStart.main(Native Method)

我不知道为什么它不会被初始化,但相同的代码在示例应用程序中运行良好。

导致错误的适配器:

public class ImageSlideAdapter extends PagerAdapter {
    ImageLoader imageLoader = ImageLoader.getInstance();
    DisplayImageOptions options;
    private ImageLoadingListener imageListener;
    FragmentActivity activity;
    List<Product> products;
    HomeFragment homeFragment;

    public ImageSlideAdapter(FragmentActivity activity, List<Product> products,
            HomeFragment homeFragment) {
        this.activity = activity;
        this.homeFragment = homeFragment;
        this.products = products;
        options = new DisplayImageOptions.Builder()
                .showImageOnFail(R.drawable.ic_error)
                .showStubImage(R.drawable.ic_launcher)
                .showImageForEmptyUri(R.drawable.ic_empty).cacheInMemory()
                .cacheOnDisc().build();

        imageListener = new ImageDisplayListener();
    }

    @Override
    public int getCount() {
        return products.size();
    }

    @Override
    public View instantiateItem(ViewGroup container, final int position) {
        LayoutInflater inflater = (LayoutInflater) activity
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.vp_image, container, false);

        ImageView mImageView = (ImageView) view
                .findViewById(R.id.image_display);
        mImageView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Bundle arguments = new Bundle();
                Fragment fragment = null;
                Log.d("position adapter", "" + position);
                Product product = (Product) products.get(position);
                arguments.putParcelable("singleProduct", product);

                // Start a new fragment
                fragment = new ProductDetailFragment();
                fragment.setArguments(arguments);

                FragmentTransaction transaction = activity
                        .getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.content_frame, fragment,
                        ProductDetailFragment.ARG_ITEM_ID);
                transaction.addToBackStack(ProductDetailFragment.ARG_ITEM_ID);
                transaction.commit();
            }
        });
        imageLoader.displayImage(
                ((Product) products.get(position)).getImageUrl(), mImageView,
                options, imageListener);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    private static class ImageDisplayListener extends
            SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections
                .synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view,
                Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
            }
        }
    }
}

请告诉我哪里出错了。需要做什么才能使其正确?

最佳答案

您必须在应用程序类中初始化 ImageLoader。

public class MyApplication extends Application {


   public static void initImageLoader(Context context) {

      File cacheDirectory = StorageUtils.getOwnCacheDirectory(context, ApplicationConstant.IMAGE_CACHE_DIRECTORY);
      ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).threadPriority(Thread.NORM_PRIORITY - 2)
                                                                                     .threadPoolSize(5)
                                                                                     .denyCacheImageMultipleSizesInMemory()
                                                                                     .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                                                                                     .memoryCacheSize(50 * 1024 * 1024)
                                                                                     .diskCache(new UnlimitedDiscCache(cacheDirectory))
                                                                                     .tasksProcessingOrder(QueueProcessingType.LIFO)
                                                                                     .writeDebugLogs()
                                                                                     .build();
      // Initialize ImageLoader with configuration.
      ImageLoader.getInstance().init(config);

   }

   @Override
   public void onCreate() {
      super.onCreate();
      initImageLoader(getApplicationContext());
   }
}

必须在应用程序标记的 list 中设置应用程序类之后

<application
        android:name="MyApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
</application>

关于java - 使用 ImageLoader 时出错,提示其未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29139593/

相关文章:

java - 使用 Oracle Wallet 身份验证从 Spring-jdbc 连接到 Oracle DB

android - 在 mac (NDK) 中构建 Telegram 源时出错

android - 在android中以横向模式在viewpager中使图像适合屏幕宽度

java - Jni jintArray 参数错误

java - 从适配器类扩展类

java - 使用 JTS 简化段列表

java - Groovy 中 Map 的 .with() 方法是什么?

android - 获取过滤recyclerview后的位置

java - 如何在java中解码数组中的十六进制代码

android - 更新 ListView 内的 ImageView