0

I am trying to scroll in a listactivity but it is laggy then crashes, this is my customadapter code:

public class CustomSearch extends ArrayAdapter<SearchFItem> {
    private List<SearchFItem> data;
    Context context;




    private static class ViewHolder {
        ImageView imageView1;
        TextView Name;
    }



    public CustomSearch(Context context, int textViewResourceId,
            List<SearchFItem> data) {
        super(context, textViewResourceId, data);


        this.data = data;
        this.context = context;

    }

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

        SearchFItem item = data.get(position);
        ViewHolder holder = null;

        View v = convertView;
        if (v == null) {
            v = LayoutInflater.from(getContext()).inflate(
                    R.layout.friends_view, null);
            holder = new ViewHolder();
            holder.imageView1 = (ImageView) v.findViewById(R.id.proView1);
            holder.Name = (TextView) v.findViewById(R.id.nameView1);
        } else {
            holder = new ViewHolder();
            holder.imageView1 = (ImageView) v.findViewById(R.id.proView1);
            holder.Name = (TextView) v.findViewById(R.id.nameView1);
        }
        final byte[] encodeByte = Base64.decode(item.getProfPic(),
                Base64.DEFAULT);

        final Bitmap profpic = BitmapFactory.decodeByteArray(encodeByte, 0,
                encodeByte.length);
        holder.imageView1.setImageBitmap(profpic);
        final String name = item.getName();
        holder.Name.setText(name);

        return v;
    }


}

and here is my error codes:

04-19 00:16:24.540: E/AndroidRuntime(1709): FATAL EXCEPTION: main
04-19 00:16:24.540: E/AndroidRuntime(1709): Process: com.example.whiteboard, PID: 1709
04-19 00:16:24.540: E/AndroidRuntime(1709): java.lang.OutOfMemoryError
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:500)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:523)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at com.example.whiteboard.CustomSearch.getView(CustomSearch.java:91)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.AbsListView.obtainView(AbsListView.java:2240)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.ListView.makeAndAddView(ListView.java:1790)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.ListView.fillUp(ListView.java:725)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.ListView.fillGap(ListView.java:664)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5136)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3236)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.AbsListView.onTouchMove(AbsListView.java:3580)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:3424)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.View.dispatchTouchEvent(View.java:7706)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.View.dispatchPointerEvent(View.java:7886)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.os.MessageQueue.nativePollOnce(Native Method)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.os.MessageQueue.next(MessageQueue.java:138)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.os.Looper.loop(Looper.java:123)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at java.lang.reflect.Method.invokeNative(Native Method)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at java.lang.reflect.Method.invoke(Method.java:515)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-19 00:16:24.540: E/AndroidRuntime(1709):     at dalvik.system.NativeStart.main(Native Method)

Thanks for any help. I have been stuck on this problem a while. But this is trying to load a list of profiles.

Ram kiran Pachigolla
  • 20,897
  • 15
  • 57
  • 78
SketchyTurtle
  • 423
  • 1
  • 5
  • 20
  • 1
    compress your image.. because of that you are getting this error. – Sagar Maiyad Apr 19 '14 at 04:31
  • in your case you are trying to load high resolution image..i suggest to [Loading Large Bitmaps Efficiently](http://developer.android.com/training/displaying-bitmaps/load-bitmap.html) or you can use Picasso or Uil liberary to avoid your budden – Santhosh Apr 19 '14 at 05:07

1 Answers1

1

If you have high resolution image , you should scale them down for/depending on different devices to load the image without facing a memory problem.

In your case, some phones may not exhibit the same behavior on the first run, but eventually(that is the part where it is getting "laggy"), without handling an optimized image loading solution, app will crash.

Check more on the "memory problem":

Topic under Load a Scaled Down Version into Memory.
Android developer optimize bitmaps help
Out of memory error on Android

On how to avoid them:
How to avoid an out of memory error while using bitmaps in Android

For an overview:
Best practices listed on a blog
More of memory leaks - overall

Before setting a bitmap for your imageview, i.e.:

holder.imageView1.setImageBitmap(profpic);  

get a scaled bitmap or try other options like inSampleSizeref: inSampleSize, do check how your solution affects the quality of your image too.
Reference: inSampleSize

Community
  • 1
  • 1
Pararth
  • 8,114
  • 4
  • 34
  • 51