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:
Versuchen Sie, dies in Ihrem onCreateView zu implementieren:
BaseActivity.imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseContext()));
Das hat für mich besser funktioniert.
Tragen Sie Folgendes in die onCreate
Ihrer Aktivität ein
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(MyActivity.this));
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 .
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();