如何在从服务器加载100+对象并将其设置为适配器时避免ANR;在android中

如何在从服务器加载100+对象并将其设置为适配器时避免ANR;在android中,android,android-anr-dialog,Android,Android Anr Dialog,我有一个MainActivity,它使用AsyncTask调用服务器,从服务器获取100多个对象列表,在获取之后,我正在使用适配器在listview中设置这些列表。这一次,如果我执行任何操作,应用程序会显示ANR。经过一段时间后,如果我再次打开该页面并执行相同的操作,应用程序将正常工作。同样的问题也会发生 注意:我使用AsyncTask从服务器获取对象。 设置listView适配器需要更多的时间如何在后台执行此操作。 请给出一些避免这种情况的建议 适配器代码: public abstract c

我有一个MainActivity,它使用AsyncTask调用服务器,从服务器获取100多个对象列表,在获取之后,我正在使用适配器在listview中设置这些列表。这一次,如果我执行任何操作,应用程序会显示ANR。经过一段时间后,如果我再次打开该页面并执行相同的操作,应用程序将正常工作。同样的问题也会发生

注意:我使用AsyncTask从服务器获取对象。 设置listView适配器需要更多的时间如何在后台执行此操作。 请给出一些避免这种情况的建议

适配器代码:

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

}

问题是,您的应用程序试图同时处理所有这些项

首先,使用recyclerView而不是listview,


第二,尝试在应用程序中添加分页

这些建议都不会阻止ANR。ANR是由于在主线程上花费太多时间造成的。ListView和RecyclerViews具有相似的性能,实际上,如果使用相同的适配器,recycler的性能会稍差一些。而且分页也无关紧要,因为实际的联网必须在主线程之外进行。他的问题可能是在主线程上进行了太多的后处理,或者做了一些他不喜欢循环调用getView的事情。因此,为了避免ANR,我建议您在视图上添加分页。选中[this]。请发布适配器及其使用的代码。我希望我的应用程序应该在后台加载这100多个对象,用户应该感觉不到加载,所以我不显示任何加载对话框。我希望用户执行一些其他操作,直到加载该列表。我观察到将适配器设置为ListView需要花费更多的时间,并且它在主线程上运行。如何使其在后台运行?
matchinglist.setOnclickListener(new onClickListener)
{
setAdapter();
...

}