-2

I have MainActivity which calls server using AsyncTask and gets 100+ list of objects from server after getting I'm using adapter to set these list in listview. This time if I perform any action app shows ANR after some times app will work normally if I Open that page again and do the same operation same problem occurs.

Note : I'm using AsyncTask to get objects from server. Setting listView adapter taking more time how to do this in background. Please give some suggestions to avoid this.

Adapter Code :

public abstract class MatchedRegularUsersAdapter extends BaseAdapter
{
    private final static String LOG_TAG = MatchedRegularUsersAdapter.class.getName();
    private LayoutInflater inflater = null;
    protected final List<MatchedRegularUser> availableMatches;
    protected Ride ride;
    protected final AppCompatActivity  activity;
    private boolean isConnectedMatch=false;
    private Drawable defaultFeMale,defaultMale;
    private List<MatchedRegularUser> matchedRegularUser = new ArrayList<>();
    private Map<Integer,UserHolder> userHolderMap = new HashMap<>();
    protected LongSparseArray<MatchedUserCachedDetails> cachedDetailsMap = new LongSparseArray<>();

    protected MatchedUsersDisplayActivity MatchedRegularUsersDisplayActivity ;
    protected MatchedRegularUsersAdapter(AppCompatActivity  activity, List<MatchedRegularUser> availableMatches,Ride ride,boolean isConnectedMatch)
    {
        super();
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.availableMatches = availableMatches;
        this.ride = ride;
        this.activity = activity;
        this.isConnectedMatch = isConnectedMatch;
    }

    @Override
    public int getCount()
    {
        return availableMatches.size();
    }

    @Override
    public MatchedRegularUser getItem(int index)
    {
        return availableMatches.get(index);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        final UserHolder userHolder;
        try
        {
            if (view == null) {
                view = inflater.inflate(R.layout.row_regular_user_new, parent, false);
                userHolder = new UserHolder();
                userHolder.startLocation = (TextView) view.findViewById(R.id.regular_start_location_user);
                userHolder.endLocation = (TextView) view.findViewById(R.id.regular_end_location_user);
                userHolder.time = (TextView) view.findViewById(R.id.timeResults);
                userHolder.points = (TextView) view.findViewById(R.id.actual_fare);
                userHolder.pointsTv = (TextView)view.findViewById(R.id.points_textview);
                userHolder.pointsLayout = (LinearLayout)view.findViewById(R.id.points_layout);
                userHolder.userImage = (ImageView) view.findViewById(R.id.regular_userImageResults);
                userHolder.userName = (TextView) view.findViewById(R.id.regular_usernameResults);
                userHolder.pickUpTimeLayout = (LinearLayout)view.findViewById(R.id.user_trip_time_layout);
                userHolder.verificationStatusImageView = (ImageView) view.findViewById(R.id.verification_status_imageView);
                userHolder.companyNameTextView = (TextView) view.findViewById(R.id.companyNameTextView);
                userHolder.ratingLinearLayout = (LinearLayout) view.findViewById(R.id.ratingLinearLayout);
                userHolder.userRating = (ImageView) view.findViewById(R.id.regular_userratingResults);
                userHolder.noOfReviewsTv = (TextView) view.findViewById(R.id.noOfReviewsTv);
                userHolder.amOrPM = (TextView) view.findViewById(R.id.timeAMorPM);
                userHolder.vehicleModelIcon = (ImageView) view.findViewById(R.id.matched_user_vehicle_model_icon);
                userHolder.rideStatusTextView = (TextView) view.findViewById(R.id.rideStatusTV);
                userHolder.matchedPerTextView = (TextView) view.findViewById(R.id.matchingPerTextView);
                userHolder.percentageLayout = (LinearLayout) view.findViewById(R.id.percentageLayout);
                userHolder.lastRideCreatedTimeTextView = (TextView)view.findViewById(R.id.lastRideCreatedTime);
                userHolder.noOfSeatsAndInvitedLayout = (LinearLayout) view.findViewById(R.id.noOfSeatsAndInvitedLayout);
                userHolder.noOfSeatsTextView = (TextView) view.findViewById(R.id.noOfSeatsTextView);
                userHolder.seatsTextView = (TextView) view.findViewById(R.id.seats_textview);
                userHolder.longDistanceDateTv=(TextView)view.findViewById(R.id.long_distance_date);
                userHolder.callOptionLayout=(LinearLayout)view.findViewById(R.id.call_image_layout);
                userHolder.callImageLayout=(ImageView) view.findViewById(R.id.call_image);
                userHolder.favouriteUserIcon = (ImageView)view.findViewById(R.id.fav_user_icon);
                userHolder.verifiedStatus = (LinearLayout) view.findViewById(R.id.verification_layout);
                userHolder.startDate = (LinearLayout) view.findViewById(R.id.startDate);
                userHolder.endDate = (LinearLayout) view.findViewById(R.id.endtDate);
                userHolder.fromDate = (TextView) view.findViewById(R.id.regular_matched_fromDate);
                userHolder.toDate = (TextView) view.findViewById(R.id.regular_matched_toDate);
                userHolder.toDateLabel = (TextView) view.findViewById(R.id.regular_matched_toDate_label);
                userHolder.weekdaysLytLayout = (HorizontalScrollView) view.findViewById(R.id.regular_week_days_layout);
                userHolder.weekdaysLyt = (LinearLayout) view.findViewById(R.id.regular_week_day_view);
                userHolder.sendInviteLyt = (LinearLayout) view.findViewById(R.id.regular_send_invite_lyt);
                userHolder.actionLabel = (TextView) view.findViewById(R.id.regular_send_invite_text);
                userHolder.moreDetail = (LinearLayout) view.findViewById(R.id.moreDetailsLayout);
                userHolder.moreDetailsTv = (TextView) view.findViewById(R.id.more_details);
                userHolder.moreDetailImage = (ImageView) view.findViewById(R.id.arrow_down_image);
                userHolder.wholeWeekdaysLayout = (LinearLayout) view.findViewById(R.id.weekdaysLayout);
                userHolder.rideNote = (LinearLayout)view.findViewById(R.id.ride_note_layout);
                view.setTag(userHolder);
            } else {
                userHolder = (UserHolder) view.getTag();
            }
            final MatchedRegularUser userInfo = availableMatches.get(position);
            userHolder.startLocation.setText(LocationClientUtils.getConsolidatedNameFromFormattedAddressForLocationAlert(userInfo.getFromLocationAddress()));
            userHolder.endLocation.setText(LocationClientUtils.getConsolidatedNameFromFormattedAddressForLocationAlert(userInfo.getToLocationAddress()));
            userHolder.userImage.setId(position);
            userHolder.userName.setText(userInfo.getName());
            setRatingAndNoOfReviews(userHolder, userInfo);
            setRideTime(userHolder, userInfo);
            setVerificationStatusDetails(userHolder, userInfo,view);
            setUsersImage(userHolder, userInfo);
            setVehicleDetails(userHolder, userInfo);
            setPointsTextViewAndColors(userHolder,userInfo,position,view);
            setNoOfSeatsOrOnTime(userHolder,userInfo);
            setFavouriteUserIndication(userHolder,userInfo);
            setRideNote(userHolder,userInfo);
            setActionLayout(userHolder.actionLabel);
            userHolder.sendInviteLyt.setId(position);
            userHolder.sendInviteLyt.setOnClickListener(inviteOnClickListener);
            setBackgroundAndLastRideCreatedTimeIfRequired(view, userHolder, userInfo);


            setMatchedPercentageText(userHolder, userInfo);
            setWeekDays(userHolder.weekdaysLyt, userInfo);

            userHolder.fromDate.setText(DateUtils.getDateWithOutSpecialChars(userInfo.getMatchedFromDate()));
            if (userInfo.getMatchedToDate() == null) {
                userHolder.endDate.setVisibility(View.GONE);
                userHolder.toDate.setVisibility(View.GONE);
            } else {
                userHolder.toDate.setText(DateUtils.getDateWithOutSpecialChars(userInfo.getMatchedToDate()));
            }
            if(isConnectedMatch)
            {
                userHolder.moreDetail.setVisibility(View.GONE);
                userHolder.wholeWeekdaysLayout.setVisibility(View.VISIBLE);
            }
            userHolder.moreDetail.setId(position);
            userHolder.moreDetail.setTag(position);
            userHolder.moreDetail.setOnClickListener(moreOnClickListener);
            userHolderMap.put(position,userHolder);
            checkForSelectedUser(userInfo,userHolder);




        }

        catch (Throwable th)
        {
            Log.e(LOG_TAG,"getView() failed",th);
        }
        return view;
    }

    private final View.OnClickListener moreOnClickListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            try {
                UserHolder userHolder = userHolderMap.get(v.getId());
                MatchedRegularUser matchedRegularuser = availableMatches.get(v.getId());

                if(!matchedRegularUser.contains(matchedRegularuser))
                {
                    userHolder.moreDetailImage.setImageDrawable(activity.getResources().getDrawable(R.drawable.dropdown_close_3x));
                    userHolder.moreDetailsTv.setText("Less");
                    userHolder.wholeWeekdaysLayout.setVisibility(View.VISIBLE);
                    matchedRegularUser.add(matchedRegularuser);
                    refreshAdapter();
                }
                else
                {
                    userHolder.wholeWeekdaysLayout.setVisibility(View.GONE);
                    userHolder.moreDetailsTv.setText("More");
                    userHolder.moreDetailImage.setImageDrawable(activity.getResources().getDrawable(R.drawable.dropdown_3x));
                    matchedRegularUser.remove(matchedRegularuser);
                    refreshAdapter();
                }



            }catch (Throwable th)
            {
                Log.i(LOG_TAG, "inside moreOnclickListener");
            }
        }
    };

    private void setMatchedPercentageText(UserHolder userHolder, MatchedRegularUser userInfo)
    {
        if(isConnectedMatch)
        {
            userHolder.percentageLayout.setVisibility(View.GONE);
        }
        else {
            userHolder.matchedPerTextView.setVisibility(View.VISIBLE);

            if ((MatchedRegularUser.REGULAR_PASSENGER.equalsIgnoreCase(userInfo.getUserRole())) && userInfo.getMatchPercentageOnMatchingUserRoute() != 0) {
                userHolder.matchedPerTextView.setText(userInfo.getMatchPercentage() + "%" + " (" + userInfo.getMatchPercentageOnMatchingUserRoute() + "%)");
            } else {
                userHolder.matchedPerTextView.setText(userInfo.getMatchPercentage() + "%");
            }
        }

    }
    private  void setNoOfSeatsOrOnTime(UserHolder userHolder, MatchedUser userInfo)
    {
        if(userInfo instanceof MatchedRegularUser)
        {
            if(((MatchedRegularUser)userInfo).getUserOnTimeComplianceRating()==null){
                userHolder.noOfSeatsAndInvitedLayout.setVisibility(View.INVISIBLE);
            }else {
                userHolder.noOfSeatsTextView.setText(((MatchedRegularUser)userInfo).getUserOnTimeComplianceRating()+"%");
                userHolder.noOfSeatsTextView.setSingleLine();
                userHolder.seatsTextView.setText("On Time");
                // userHolder.seatTextview.setTextColor(activity.getResources().getColor(R.color.fav_footer_bg_one));
            }
        }
        if(isConnectedMatch){
            userHolder.noOfSeatsAndInvitedLayout.setVisibility(View.GONE);
        }
    }
    private void setPointsTextViewAndColors(final UserHolder userHolder, MatchedRegularUser userInfo, int position, View view)
    {
        if(isConnectedMatch)
        {
            userHolder.pointsLayout.setVisibility(View.GONE);
        }
        else {
            userHolder.points.setVisibility(View.VISIBLE);
            double pointsToShow = userInfo.getPoints();
            userHolder.points.setText(String.valueOf(StringUtil.getPointsWithTwoDecimal(pointsToShow)));
        }
    }


    public  void navigateToProfile(MatchedRegularUser MatchedRegularUser) {
        boolean isContactOptionRequired =true;
        if (!RideViewUtils.getUserQualifiedToDisplayContact()) {
            isContactOptionRequired = false;
        }
        Intent viewIntent = new Intent(activity, ActivityUtils.getProfileDisplayClass(QuickRideApplication.getApplicationName(QuickRideApplication.getInstance().getApplicationContext())));
        viewIntent.putExtra(ProfileDisplayActivity.USER_ID, String.valueOf( MatchedRegularUser.getUserid()));
        viewIntent.putExtra(ProfileDisplayActivity.IS_JOIN_ACTION_REQUIRED, false);
        viewIntent.putExtra(ProfileDisplayActivity.IS_CONTACT_LAYOUT_REQUIRED, isContactOptionRequired);
        MatchedRegularUsersDisplayActivity.startActivity(viewIntent);
    }

    private void setImageAndTextColorsBasedOnMatchedRegularUser(UserHolder userHolder,MatchedRegularUser userInfo)
    {
        if(userInfo.getRideid()==0)
        {
            userHolder.userImage.setAlpha((float)0.5);
            userHolder.userName.setTextColor(activity.getResources().getColor(R.color._9B9B9B));
            userHolder.startLocation.setTextColor(activity.getResources().getColor(R.color._9B9B9B));
            userHolder.endLocation.setTextColor(activity.getResources().getColor(R.color._9B9B9B));
        }
        else
        {
            userHolder.userImage.setAlpha((float)1);
            userHolder.userName.setTextColor(activity.getResources().getColor(R.color._5050550));
            userHolder.startLocation.setTextColor(activity.getResources().getColor(R.color._363636));
            userHolder.endLocation.setTextColor(activity.getResources().getColor(R.color._363636));
        }
    }
    private void setBackgroundAndLastRideCreatedTimeIfRequired(View view,UserHolder userHolder,MatchedRegularUser userInfo)
    {
        if(userInfo.getRideid()==0)
        {
            view.setBackground(activity.getResources().getDrawable(R.drawable.listview_grey_selector));
            userHolder.lastRideCreatedTimeTextView.setVisibility(View.VISIBLE);
            userHolder.lastRideCreatedTimeTextView.setText(getTextForLastRideCreated(userInfo.getLastRideCreatedTime()));
        }
        else
        {
            view.setBackground(activity.getResources().getDrawable(R.drawable.listview_selector));
            userHolder.lastRideCreatedTimeTextView.setVisibility(View.GONE);
            userHolder.lastRideCreatedTimeTextView.setText(null);
        }
    }
    private String getTextForLastRideCreated(Date lastRideCreatedTime)
    {
        Date currentDate = new Date();
        int dateDifference = 1;
        if(lastRideCreatedTime !=null && lastRideCreatedTime.getTime() < currentDate.getTime())
        {
            dateDifference = DateUtils.calculateTimeDifferenceBetweenDatesInDays(currentDate,lastRideCreatedTime);
            if(dateDifference <1)
            {
                dateDifference = 1;
            }
        }
        String text = activity.getResources().getString(R.string.last_ride_created);
        if(dateDifference ==1)
        {
            text = text+dateDifference+activity.getResources().getString(R.string.day_ago);
        }
        else
        {
            text = text+dateDifference+activity.getResources().getString(R.string.days_ago);
        }
        return text;
    }
    private void setActionLayout( TextView actionLabel)
    {
        if(isConnectedMatch)
        {
            actionLabel.setText(activity.getString(R.string.remove));
        }
        else
        {
            actionLabel.setText(activity.getString(R.string.send_invite));
        }
    }

    private void setUsersImage(final UserHolder userHolder, MatchedRegularUser userInfo)
    {
        Log.i(LOG_TAG, "setting of users image");
        if(userInfo == null)
        {
            if(activity != null && !activity.isFinishing())Toast.makeText(activity,activity.getResources().getString(R.string.unableToProcess),Toast.LENGTH_SHORT).show();
            return;
        }
        ImageCache imageCache = ImageCache.getInstance();
        if(imageCache == null || userInfo.getImageURI()==null)
        {
            getDefaultUserImageForGuest(userHolder.userImage,userInfo);
        }

        else
        {getDefaultUserImageForGuest(userHolder.userImage, userInfo);
            if(userInfo.getImageURI() != null && !userInfo.getImageURI().isEmpty())
            {
                imageCache.getUserImage(userInfo.getImageURI(), userInfo.getGender(), ImageCache.SSIZE, userHolder.userImage, null,String.valueOf(userInfo.getUserid()),false);
            }
        }
    }
    private void getDefaultUserImageForGuest(ImageView userImageView, MatchedRegularUser userInfo)
    {..
    }
    private final View.OnClickListener inviteOnClickListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            final MatchedRegularUser matchedRegularUser= availableMatches.get(v.getId());
            if(matchedRegularUser == null) return;
            if(isConnectedMatch)
            {
                QuickRideModalDialog.displayConfirmationsDialog(activity, activity.getResources().getString(R.string.confirm_cancel_title), new QuickRideModalDialog.ModelDialogActionListener() {
                    @Override
                    public void doPrimaryAction() {
                        onRemoveClick(matchedRegularUser);
                    }

                    @Override
                    public void doSecondaryAction() {

                    }
                });

            }
            else
            {
                onInviteClick(matchedRegularUser);
            }
        }
    };


    private void setFavouriteUserIndication(UserHolder userHolder, MatchedRegularUser MatchedRegularUser)
    {
        if(UserDataCache.getCacheInstance().isFavouritePartner(MatchedRegularUser.getUserid()))
        {
            userHolder.favouriteUserIcon.setVisibility(View.VISIBLE);
        }else {
            userHolder.favouriteUserIcon.setVisibility(View.GONE);
        }
    }
    private void setVerificationStatusDetails(UserHolder userHolder, MatchedRegularUser userInfo, View view)
    {

    }
    private void setRideTime(final UserHolder userHolder, final MatchedRegularUser userInfo)
    {     if(isConnectedMatch)
    {
        userHolder.pickUpTimeLayout.setVisibility(View.GONE);
    }
    else if(userInfo instanceof MatchedRegularPassenger && userInfo.getPassengerReachTimeToPickup() != null){

        userHolder.time.setText(DateUtils.getTimeStringFromDateForSingleDigitForHours(
                userInfo.getPassengerReachTimeToPickup()));
        userHolder.amOrPM.setText(DateUtils.getTimeStringFromDateOnlyMeridian(userInfo.getPassengerReachTimeToPickup()));


    }else{
        userHolder.time.setText(DateUtils.getTimeStringFromDateForSingleDigitForHours(
                userInfo.getPickupTime()));
        userHolder.amOrPM.setText(DateUtils.getTimeStringFromDateOnlyMeridian(
                userInfo.getPickupTime()));

    }
        LinearLayout.LayoutParams pickUpLayout = (LinearLayout.LayoutParams) userHolder.pickUpTimeLayout.getLayoutParams();
        LinearLayout.LayoutParams rateLayout = (LinearLayout.LayoutParams) userHolder.ratingLinearLayout.getLayoutParams();
    }
    private void setRatingAndNoOfReviews(UserHolder userHolder, MatchedRegularUser userInfo)
    {

    }
    private void setVehicleDetails(UserHolder userHolder, MatchedRegularUser userInfo)
    {
        if(userInfo instanceof MatchedRegularRider)
        {

        }
        else
        {
            userHolder.vehicleModelIcon.setVisibility(View.INVISIBLE);
        }
    }

    protected abstract void onInviteClick(MatchedRegularUser matchedRegularUser);
    protected abstract void onRemoveClick(MatchedRegularUser matchedRegularUser);
    protected abstract void completeInvite(MatchedRegularUser matchedRegularUser);

    private void setWeekDays(LinearLayout weekDays,MatchedRegularUser MatchedRegularUser)
    {
        ....
    }
   private void checkForSelectedUser(MatchedRegularUser matchedRegularuser, UserHolder userHolder)
    {           
        if(isConnectedMatch)
        {
            userHolder.moreDetail.setVisibility(View.GONE);
            userHolder.wholeWeekdaysLayout.setVisibility(View.VISIBLE);
        }

    }
   private void refreshAdapter()
    {
        if(activity !=null && activity instanceof CommonMapActivity)
        {
            CommonMapActivity commonMapActivity = (CommonMapActivity)activity;
            ..
        }
    }
    private boolean checkForMoreDetailsClicked(MatchedRegularUser matchedRegularuser,List<MatchedRegularUser> matchedRegularUser) {
        ..
        return isMatchedUserPresent;
    }
    private void addWeekDayView(Time timeOfDay,String nameOfDay,LinearLayout weekDays)
    {
        ......
    }
   static class UserHolder
    {
        ImageView userImage,moreDetailImage,favouriteUserIcon,userRating,verificationStatusImageView,vehicleModelIcon,callImageLayout;
        TextView userName, startLocation, endLocation,fromDate,toDate,actionLabel,toDateLabel,noOfReviewsTv,companyNameTextView,amOrPM,time,noOfSeatsTextView,seatsTextView;
        LinearLayout rideNote,wholeWeekdaysLayout,weekdaysLyt,startDate,endDate,sendInviteLyt,verifiedStatus,moreDetail,ratingLinearLayout,pickUpTimeLayout,percentageLayout,noOfSeatsAndInvitedLayout,pointsLayout,callOptionLayout;
        HorizontalScrollView weekdaysLytLayout;
        TextView longDistanceDateTv,moreDetailsTv,lastRideCreatedTimeTextView,points,pointsTv,rideStatusTextView,matchedPerTextView,sendInviteTextView;
    }

}

MainActivity.java

...

matchinglist.setOnclickListener(new onClickListener)
{
setAdapter();
...

}
sana
  • 1
  • 2
  • As you said you are getting 100+ object in the response. So, to avoid ANR I suggest you add pagination on the view. Check [this] (https://medium.com/@etiennelawlor/pagination-with-recyclerview-1cb7e66a502b). – Sunny Sep 05 '18 at 16:30
  • Can you please post the code for the adapter and its use. – theblitz Sep 05 '18 at 16:33
  • I want my application should load those 100+ objects in background, users should not able to feel that loading so I'm not displaying any loading dialog . I want users to perform some other operations till that list loads. – sana Sep 07 '18 at 03:37
  • I observed that Setting Adapter to ListView Is taking more time and it runs on main thread. How to make it to run on background? – sana Sep 07 '18 at 08:49

1 Answers1

-1

Well the problem is - your application trying to handle all those items at once.

First of all use recyclerView instead of listview, RecyclerView vs. ListView

2nd try to add pagination to your application https://developer.android.com/topic/libraries/architecture/paging/

Maksym V.
  • 2,491
  • 13
  • 24
  • 2
    Neither of those suggestions is going to stop an ANR. An ANR is caused by spending too much time on the main thread. ListVIews and RecyclerViews have similar performance (actually recycler is slightly worse) given the same adapter. And pagination won't matter since the actual networking must occur off main thread. His problem is going to be either too much post processing on the main thread, or doing something he shouldn't like looping calling getView. – Gabe Sechan Sep 05 '18 at 16:15