Android - fragment with three listviews crashes with out of memory error

筅森魡賤 提交于 2019-12-25 01:17:33

问题


I've made this simple fragment layout -

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ListView
        android:id="@+id/listView_airplanes"
        android:layout_width="170dp"
        android:layout_height="wrap_content" >
    </ListView>

    <ListView
        android:id="@+id/listView_fruits"
        android:layout_width="170dp"
        android:layout_height="wrap_content" >
    </ListView>

    <ListView
        android:id="@+id/listView_animals"
        android:layout_width="170dp"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

Now each row in each of those listviews should show an image that sits in the assets folder.

so the layout of each list item is like this -

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/@null" />

</LinearLayout>

Now, I've made a layout for each one of the listview, but it all look the same - just one imageview in it.

Now for the code -

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

View v = inflater.inflate(R.layout.listsviews,container, false);

 lvTops = (ListView) v.findViewById(R.id.listView_airplanes);
         lvBottoms = (ListView) v.findViewById(R.id.listView_fruits);
         lvMiddle = (ListView) v.findViewById(R.id.listView_animals);

dbHand = new DbHandler(getActivity());

Cursor topCursor = dbHand.queryByCat("airplanes);
Cursor bottomCursor = dbHand.queryByCat("fruits");
Cursor middleCursor = dbHand.queryByCat("animals");


            getActivity().startManagingCursor(topCursor);


            getActivity().startManagingCursor(bottomCursor);


            getActivity().startManagingCursor(middleCursor);

            topadp = new TopsAdptor(getActivity(), topCursor);
            lvTops.setAdapter(topadp);

            botadp = new BottomsAdaptor(getActivity(), bottomCursor);
            lvBottoms.setAdapter(botadp);

            middleCursor = new MiddleAdptor(getActivity(), topCursor);
            lvMiddle.setAdapter(topadp);



}

As you can see I'm using a custom adapter class for each one of the listviews.

All the adapters code are the same -so here's an example -

    class BottomsAdaptor extends CursorAdapter {

    public BottomsAdaptor(Context context, Cursor c) {
        super(context, c);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // TODO Auto-generated method stub
        String pic = cursor.getString(cursor
                .getColumnIndex(Constants.ITEM_PIC_URL));

        ImageView iv = (ImageView) view.findViewById(R.id.imageView_lv_bottom);




        try {
            InputStream ims;
            ims = getActivity().getAssets().open(pic);
            Drawable d = Drawable.createFromStream(ims, null);
            iv.setImageDrawable(d);

        } catch (IOException e) {


            e.printStackTrace();
        }


    }

    @Override
    public View newView(Context arg0, Cursor arg1, ViewGroup parent) {
        // TODO Auto-generated method stub
        return getActivity().getLayoutInflater().inflate(R.layout.bottoms_list_item, parent,
                false);
    }

}

Now the thing is that in small numbers of images (let's say 5 for each listview) it sure seems to work fine, but when I raise the number of images in each listview, then while scrolling down at one of the listview the app is crashing and in the log it says -

java.lang.OutOfMemoryError

Now I've also tried to use asynctask like so -

    class Asyinc extends AsyncTask<Void, Void, Void>{
     Cursor topCursor;
     Cursor bottomCursor;
     Cursor middleCursor;

    @Override
    protected Void doInBackground(Void... params) {

         topCursor = dbHand.queryByCat("tops");
         bottomCursor = dbHand.queryByCat("bottoms");
         middleCursor;= dbHand.queryByCat("dress");


        getActivity().startManagingCursor(topCursor);

        getActivity().startManagingCursor(bottomCursor);
        getActivity().startManagingCursor(middleCursor);


        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        super.onPostExecute(result);


        topadp = new TopsAdptor(getActivity(), topCursor);
        lvTops.setAdapter(topadp);


        botadp = new BottomsAdaptor(getActivity(), bottomCursor);
        lvBottoms.setAdapter(botadp);


        middleatp = new DressedAdptor(getActivity(), middleCursor);
        lvMiddle.setAdapter(middleatp);




    }

}

But still the app is crashing while trying to scrolling in the listviews.

Any ideas how may i solved this? Thanks for any kind of help

Here's the logcat error, when I used the asynctask -

    11-15 00:54:15.635: E/AndroidRuntime(4050): FATAL EXCEPTION: main
11-15 00:54:15.635: E/AndroidRuntime(4050): java.lang.OutOfMemoryError
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.graphics.drawable.Drawable.createFromStream(Drawable.java:741)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at com.example.app1.MyFrag$BottomsAdaptor.bindView(MywordFrag.java:262)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.AbsListView.obtainView(AbsListView.java:2267)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.ListView.makeAndAddView(ListView.java:1769)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.ListView.fillDown(ListView.java:672)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.ListView.fillGap(ListView.java:636)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5036)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3193)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.AbsListView.startScrollIfNeeded(AbsListView.java:3138)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:3463)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.View.dispatchTouchEvent(View.java:7127)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.app.Activity.dispatchTouchEvent(Activity.java:2396)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.View.dispatchPointerEvent(View.java:7307)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3172)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3117)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4153)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4132)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4224)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.os.MessageQueue.nativePollOnce(Native Method)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.os.MessageQueue.next(MessageQueue.java:125)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.os.Looper.loop(Looper.java:124)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at android.app.ActivityThread.main(ActivityThread.java:4745)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at java.lang.reflect.Method.invokeNative(Native Method)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at java.lang.reflect.Method.invoke(Method.java:511)
11-15 00:54:15.635: E/AndroidRuntime(4050):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:

回答1:


Either the Image sizes are too big or something else. you can try adding

android:largeHeap="true"

On your Application Tag in your manifest file. See if that solves the case. Although it is not guarantee to fix it. as stated here: http://developer.android.com/guide/topics/manifest/application-element.html

But it did fixed my out of memory error in my app. See if that helps you too.



来源:https://stackoverflow.com/questions/26941509/android-fragment-with-three-listviews-crashes-with-out-of-memory-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!