wake-up-neo.com

Android - ImageLoader muss vor der Verwendung in UIL mit der Konfiguration initialisiert werden

Ich habe den Fehler erhalten:

ImageLoader muss mit der Konfiguration initialisiert werden, bevor der Fehler von Illegal State Exception verwendet wird.

Ich bemühe mich, die Bilder in meiner Herangehensweise darzustellen, die Rasteransicht in Fragmente einzufügen. Nach meinem Verständnis sollte die imageLoader zuerst durch die Erweiterung der Klasse AbsListViewBaseActivity initialisiert werden, die BaseActivity erweitert.

Diese beiden Klassen werden zum Initialisieren der imageLoader verwendet. Ich habe den Fluss ziemlich durcheinander gebracht, und ich bekomme Fehler in der Laufzeit und arbeite seit zwei Tagen damit. Ich füge LogCat-Fehler hinzu.

Meine eigene Version

--Hauptklasse

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);
    }
}

Ursprüngliche Implementierung und Ablauf des Programms

--Hauptklasse

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);
        }
    }
}

BaseActivity

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)

Basierend auf diesem Ansatz:

Bildergalerie

34
rahstame

Versuchen Sie, dies in Ihrem onCreateView zu implementieren:

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

Das hat für mich besser funktioniert.

Tragen Sie Folgendes in die onCreate Ihrer Aktivität ein

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

Ich denke, Sie verwenden die Universal Image Loader-API. Wenn ja, haben Sie vergessen, den Image Loader in der Application-Klasse zu konfigurieren.

Fügen Sie die folgende Funktion in Ihrer Application-Klasse hinzu:

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());
}

Weitere Einzelheiten finden Sie in diesem Beispiel .

6
Jaiprakash Soni

Fügen Sie einfach den folgenden Code in die BaseActivity- oder MyApplication-Klasse ein:

public ImageLoader getImageLoader() {

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

Wenn Sie dann den Image Loader verwenden möchten, erstellen Sie eine neue Instanz von ImageLoader.

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

Oder wenn Sie BaseActivitiy nehmen, geben Sie den Code hier ein:

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