【问题标题】:Android - ImageLoader must be init with configuration before using in UILAndroid - 在 UIL 中使用之前,ImageLoader 必须通过配置初始化
【发布时间】:2013-07-18 06:04:44
【问题描述】:

我得到了错误:

ImageLoader 必须在使用前进行配置初始化是来自非法状态异常的错误。

我在将 gridview 放在片段中的方法中努力显示图像。至于我的理解,imageLoader 应该首先通过扩展将扩展BaseActivity 的类 AbsListViewBaseActivity 来初始化。

这两个类用于初始化imageLoader。我把流程搞砸了,我在运行时遇到错误,两天内一直在处理这个问题。我将包含 LogCat 错误。

我自己的版本

--主类

import com.nostra13.universalimageloader.core.ImageLoader;
import com.folder.folder.AbsListViewBaseActivity;

public class CollectionDemoActivity extends FragmentActivity{

    assignImageLoader newAssign;
    static AbsListViewBaseActivity absList;
    static ImageAdapter m3;

    Oncreate()
    {
        newAssign = assignImageLoader;
        m3 = ImageAdapter();
        ((GridView) absList.listView).setAdapter(m3);
    }
}


/**
 * A dummy fragment representing a section of the app, but that simply displays dummy text.
 */

public static class DemoObjectFragment extends Fragment {

    public static final String ARG_OBJECT = "object";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.ac_image_grid, container, false);

        List<Menu> itemsDatabase = db.getItemsAsArray("items");
        List<String> items = new ArrayList<String>();

        for (Menu cn : itemsDatabase) {

            HashMap<String, String> map = new HashMap<String, String>();
            items.add(cn.getImagePath().toString());
            values2.add(map);
        }

        imageUrls = items.toArray(new String[items.size()]);

        options2 = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.ic_stub)
            .showImageForEmptyUri(R.drawable.ic_empty)
            .showImageOnFail(R.drawable.ic_error)
            .cacheInMemory(true)
            .cacheOnDisc(true)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .build();

        absList.listView = (GridView)rootView.findViewById(R.id.gridview);

        ((GridView) absList.listView).setAdapter(m3);
        absList.listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //startImagePagerActivity(position);
                //Toast.makeText(getBaseContext(), "Clieckeed", Toast.LENGTH_SHORT).show();
                //Log.d("Inside Onclick:", view.toString());
            }
        });
        return rootView;
    }
}

class ImageAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        return imageUrls.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {

        View view = convertView;
        final ViewHolder holder;

        // Assign Values
        holder.name.setText(values2.get(position).get(TAG_NAME2 ).toString());
        holder.price.setText("Price: " + values2.get(position).get(TAG_PRICE2).toString());

        holder.br.setStepSize(1);
        holder.br.setFocusable(false);

        Log.d("Image Path Value in GridViewdd: ", values2.get(position).get(TAG_IMAGE_NAME2).toString());

        newAssign.getImageLoader("Image Path", holder.image, options2);

        return view;
    }

    class ViewHolder {
        public TextView name;
        public TextView price;
        public ImageView image;
        public RatingBar br;
    }
}

static class assignImageLoader extends AbsListViewBaseActivity{
    static ImageLoader mg;

    assignImageLoader()
    {
        mg = imageLoader;
    }

    public void getImageLoader(String path, ImageView img, DisplayImageOptions options)
    {
        imageLoader.displayImage(path, img, options);
    }
}

程序的原始实现和流程

--主类

public class ImageGridActivity extends AbsListViewBaseActivity {

    onCreate()
    {
        ((GridView) listView).setAdapter(new ImageAdapter());
    }

    public class ImageAdapter extends BaseAdapter {

        public View getView(final int position, View convertView, ViewGroup parent) {

            imageLoader.displayImage(path, holder.image, options2);
        }
    }
}

--AbsListViewBaseActivity

public class AbsListViewBaseActivity extends BaseActivity {

    protected static final String STATE_PAUSE_ON_SCROLL = "STATE_PAUSE_ON_SCROLL";
    protected static final String STATE_PAUSE_ON_FLING = "STATE_PAUSE_ON_FLING";

    public AbsListView listView;

    protected boolean pauseOnScroll = false;
    protected boolean pauseOnFling = true;

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        pauseOnScroll = savedInstanceState.getBoolean(STATE_PAUSE_ON_SCROLL, false);
        pauseOnFling = savedInstanceState.getBoolean(STATE_PAUSE_ON_FLING, true);
    }

    @Override
    public void onResume() {
        super.onResume();
        applyScrollListener();
    }

    private void applyScrollListener() {
        listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(STATE_PAUSE_ON_SCROLL, pauseOnScroll);
        outState.putBoolean(STATE_PAUSE_ON_FLING, pauseOnFling);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem pauseOnScrollItem = menu.findItem(R.id.item_pause_on_scroll);
        pauseOnScrollItem.setVisible(true);
        pauseOnScrollItem.setChecked(pauseOnScroll);

        MenuItem pauseOnFlingItem = menu.findItem(R.id.item_pause_on_fling);
        pauseOnFlingItem.setVisible(true);
        pauseOnFlingItem.setChecked(pauseOnFling);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.item_pause_on_scroll:
                pauseOnScroll = !pauseOnScroll;
                item.setChecked(pauseOnScroll);
                applyScrollListener();
                return true;

            case R.id.item_pause_on_fling:
                pauseOnFling = !pauseOnFling;
                item.setChecked(pauseOnFling);
                applyScrollListener();
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

基础活动

public abstract class BaseActivity extends Activity {

    public ImageLoader imageLoader = ImageLoader.getInstance();

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
                //Added in the code by me for handling the init error
        imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseContext()));

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.item_clear_memory_cache:
                imageLoader.clearMemoryCache();
                return true;

            case R.id.item_clear_disc_cache:
                imageLoader.clearDiscCache();
                return true;

            default:
                imageLoader.destroy();
                return false;
        }
    }
}

Logcat:

07-19 11:28:26.909: E/AndroidRuntime(24023): FATAL EXCEPTION: main
07-19 11:28:26.909: E/AndroidRuntime(24023): java.lang.IllegalStateException: ImageLoader must be init with configuration before using
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.nostra13.universalimageloader.core.ImageLoader.checkConfiguration(ImageLoader.java:325)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:170)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:134)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.jinisys.restoplusordering.CollectionDemoActivity$assignImageLoader.getImageLoader(CollectionDemoActivity.java:448)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.jinisys.restoplusordering.CollectionDemoActivity$ImageAdapter.getView(CollectionDemoActivity.java:424)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.AbsListView.obtainView(AbsListView.java:2267)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.GridView.onMeasure(GridView.java:1030)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1447)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.View.measure(View.java:15181)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer.doFrame(Choreographer.java:525)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.os.Handler.handleCallback(Handler.java:615)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.os.Looper.loop(Looper.java:137)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at android.app.ActivityThread.main(ActivityThread.java:4745)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at java.lang.reflect.Method.invokeNative(Native Method)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at java.lang.reflect.Method.invoke(Method.java:511)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-19 11:28:26.909: E/AndroidRuntime(24023):     at dalvik.system.NativeStart.main(Native Method)

基于此方法:

ImageGallery

【问题讨论】:

  • stackoverflow.com/questions/16789676/…。检查这个 UIL 的例子。可能有帮助
  • 第 448 行 CollectionDemoActivity.java 上有什么内容?还有CollectionDemoActivity.java中的Oncreate()这个方法是什么?
  • @Raghunandan 我试图查看答案和代码,但我认为这远远不是我需要的。也许我的需要是扩展另一个类操作以从原始类中获得相同的流程。不过不确定。请先生帮我解决这个问题。我在两天内一直在使用这个。
  • 错误488,imageLoader.displayImage(path, img, options);
  • 我很困惑你的适配器类有这个newAssign.getImageLoader(Image Path, holder.image, options2) 你的视图持有者和选项2在哪里初始化。您的应用流程非常混乱

标签: java android android-fragments universal-image-loader


【解决方案1】:

首先,通过进入项目属性→Java构建路径检查用户imageLoader.jar数据包是否正确包含在项目中。

二、implement这个代码在onCreateView

BaseActivity.imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseCont‌​ext()));

【讨论】:

  • “用户imageLoader.jar包”是什么意思?
【解决方案2】:

尝试在你的 onCreateView 中实现这个:

对于活动 -

BaseActivity.imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseCont‌​ext()));

对于片段 -

ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(getActivity()));

【讨论】:

  • 很高兴为您提供帮助。随时。 :P
  • 我应该在哪里实现它??
  • 如果你仍然不知道@Serafins,你可以在 onCreateView 中实现它
  • @TheLittleNaruto ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(MyActivity.this)); 这种方式对我有用。
  • ImageLoader imageLoader =ImageLoader.getInstance(); imageLoader.init(ImageLoaderConfiguration.createDefault(ctx));这将工作......!!
【解决方案3】:

只需将以下代码放在 BaseActivity 或 MyApplication 类中:

public ImageLoader getImageLoader() {

    if (mImageLoader == null) {
        mImageLoader = ImageLoader.getInstance();
        mImageLoader.init(ImageLoaderConfiguration.createDefault(this));
    }
    return this.mImageLoader;
}

然后,每当您想使用图像加载器时,就创建一个新的 ImageLoader 实例,如下所示:

private ImageLoader imageLoader = MyApplication.getInstance().getImageLoader();

或者如果您选择BaseActivitiy,请在此处输入代码:

private ImageLoader imageLoader = BaseActivity.getInstance().getImageLoader();

【讨论】:

    【解决方案4】:

    我认为您正在使用通用图像加载器 API。如果是,那么您忘记在 Application 类中配置图像加载器了。

    在您的应用程序类中添加以下函数:

    public static void initImageLoader(Context context) {
    
        // This configuration tuning is custom. You can tune every option, you may tune some of them,
        // or you can create default configuration by the
        //  ImageLoaderConfiguration.createDefault(this);
        // method.
        //
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        config.denyCacheImageMultipleSizesInMemory();
        config.diskCacheFileNameGenerator(new Md5FileNameGenerator());
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        config.tasksProcessingOrder(QueueProcessingType.LIFO);
        config.writeDebugLogs(); // Remove for release app
    
        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config.build());
    }
    

    更多详情,请查看this sample

    【讨论】:

      【解决方案5】:

      这对我来说效果更好。

      将以下内容放入您的活动的onCreate

         ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(MyActivity.this));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        • 1970-01-01
        • 2019-08-16
        • 2012-09-08
        • 2014-03-02
        • 1970-01-01
        • 2020-01-20
        相关资源
        最近更新 更多