2013-07-19 26 views
28

mam błąd:Android - imageLoader należy init, z konfiguracji przed użyciem w UIL

ImageLoader must be init with configuration before using is the error from Illegal State Exception.

walczę do wyświetlania obrazów w moim podejściu oddanie GridView wewnątrz ciągu fragmentów. Co do mojego zrozumienia, najpierw należy zainicjować imageLoader, rozszerzając klasę AbsListViewBaseActivity, która będzie rozszerzać BaseActivity.

Te dwie klasy służą do inicjowania imageLoader. Zaskoczyłem przepływ, i dostaję błędy w czasie pracy i pracuję z tym od dwóch dni. Dołączę błędy LogCat.

własną wersję

- Main Class

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

Original wdrożenia i przepływu programu

- Main Class

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) 

Oparcie z tego podejścia:

ImageGallery

+0

http://stackoverflow.com/questions/16789676/caching-images-and-displaying/16978285#16978285. sprawdź ten przykład UIL. może pomóc – Raghunandan

+0

, co jest w linii 448 'CollectionDemoActivity.java'? Co to jest ta metoda 'Oncreate()' w 'CollectionDemoActivity.java'? – Raghunandan

+0

@Raghunandan Próbowałem zobaczyć odpowiedzi i kody, ale myślę, że jest daleko od tego, czego potrzebuję. Być może moja potrzeba polega na rozszerzeniu innych manipulacji klasowych, aby uzyskać ten sam przepływ od oryginału. Nie jestem tego pewien. Proszę, pomóż mi z tym sir. Pracowałem z tym przez dwa dni. – rahstame

Odpowiedz

98

próby wdrożenia tego wewnątrz onCreateView:

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

Dziękuję za tę wspaniałą odpowiedź !!! Pracowałem bez kłopotów .. :) – rahstame

+0

Miło mi pomóc. W każdej chwili. : P – TheLittleNaruto

+0

gdzie powinienem go wdrożyć? – Serafins

6

myślę używasz Universal ładowarka obraz API. Jeśli tak, to zapomniałeś skonfigurować program ładujący obrazy w klasie Application.

Dodaj funkcję poniżej w swojej klasie aplikacji:

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

Aby uzyskać więcej informacji, sprawdź this sample.

+0

Sir, dodałem kody powyżej Mam nadzieję, że to może pomóc. – rahstame

+0

Link już nie działa – TWilly

-1

Po pierwsze, sprawdź, czy pakiet imageLoader.jar użytkownik jest prawidłowo ujęte w projekcie wchodząc w właściwości projektu → Java Build Path.

Po drugie, zaimplementuj ten kod w onCreateView: BaseActivity.imageLoader.init (ImageLoaderConfiguration.createDefault (getBaseCont ext()));

+0

Co masz na myśli przez "pakiet user imageLoader.jar"? –

0

Wystarczy umieścić następujący kod w BaseActivity lub MyApplication klasy:

public ImageLoader getImageLoader() { 

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

wtedy gdy chcesz używać programu ładującego obrazu następnie utworzyć nową instancję imageLoader, jak następuje:

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

Albo jeśli wziąć BaseActivitiy wpisać kod tutaj:

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

To działało lepiej dla mnie.

umieścić następującą informację w onCreate swojej działalności

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