如何加快定期更新许多UI项目的程序?

时间:2016-03-06 01:50:02

标签: java android

我创建了一个小应用程序,我有一个产品列表,每个产品我有一个到期时间。如果用户选择喜欢某个产品(showTimerPost),产品的到期时间会增加,比如说5秒钟。我尝试使用处理程序,它实际上工作但我的应用程序开始运行非常慢可能是因为它每秒都在更改UI。我真的坚持这个问题1个月。将不胜感激。

package com.blueflair.incre;


import com.blueflair.incre.app.AppController;
import com.blueflair.incre.data.FeedItem;

import java.util.ArrayList;

import java.util.List;
import java.util.concurrent.TimeUnit;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.volley.toolbox.ImageLoader;


public class FeedListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    LocalUserData userLocalStore;
    long postExpiry;
    String timerFormat;
    private int defaultPostIncrementation = 900000;
    private List<FeedItem> feedItems;
    boolean favourite;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();
    private long timeDiff;
    private final List<ViewHolder> lstHolders;
    private int avatarSize;
    Handler handler = new Handler();
    private Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            for (final ViewHolder holder : lstHolders) {
                holder.showTimerPost.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        long currentTime = System.currentTimeMillis();
                        currentTime--;
                        holder.showTimerPost.setText(String.valueOf(holder.updateTimeRemaining(currentTime)));
                        notifyDataSetChanged();
                    }
                }, 2000);
            }
        }
    };


    public FeedListAdapter(Activity activity, List<FeedItem> feedItems) {
        this.activity = activity;
        this.feedItems = feedItems;
        lstHolders = new ArrayList<>();
    }


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

    @Override
    public Object getItem(int location) {
        return feedItems.get(location);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.feed_item, null);

        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();

        final FeedItem item = feedItems.get(position);
        holder = new ViewHolder();
        userLocalStore = new LocalUserData(activity);
        final User user = userLocalStore.getLoggedInUser();
        postExpiry = item.getPostExpiry();
        avatarSize = activity.getResources().getDimensionPixelSize(R.dimen.feed_avater_size);

        holder.name = (TextView) convertView.findViewById(R.id.userFeedName);
        holder.timestamp = (TextView) convertView
                .findViewById(R.id.timestamp);
        holder.statusMsg = (TextView) convertView
                .findViewById(R.id.txtStatusMsg);

        holder.profilePic = (ImageView) convertView
                .findViewById(R.id.profilePic);
        holder.profilePic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bundle args= new Bundle();
                args.putInt("userId", item.getUserId());
                Fragment profileViewFragment = new ProfileViewFragment();
                profileViewFragment.setArguments(args);
                FragmentTransaction ft = ((MainActivity)activity).getSupportFragmentManager().beginTransaction();
                ft.setCustomAnimations(R.anim.slide_in_done, R.anim.slide_out_send);
                ft.replace(R.id.container_body, profileViewFragment);
                ft.addToBackStack(null);
                ft.commit();
            }
        });
        holder.feedImageView = (FeedImageView) convertView
                .findViewById(R.id.feedImage1);

        String username = "@"+item.getUserName();
        holder.name.setText(username);

        convertView.setTag(holder);

        synchronized ( lstHolders) {
            lstHolders.add(holder);
        }
        // Converting timestamp into x ago format
        CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
                Long.parseLong(item.getTimeCreated()),
                System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);
        holder.timestamp.setText(timeAgo);
        holder.showTimerPost = (Button) convertView.findViewById(R.id.showPostTimer);
        handler.post(timerRunnable);
        holder.showTimerPost.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                item.setIncrementToExpiry(50000);
                notifyDataSetChanged();
            }
        });
        // Chcek for empty status message
        if (!TextUtils.isEmpty(item.getPostMessage())) {
            holder.statusMsg.setText(item.getPostMessage());
            holder.statusMsg.setVisibility(View.VISIBLE);
        } else {
            // status is empty, remove from view
            holder.statusMsg.setVisibility(View.GONE);
        }

        // Feed image
        if (item.getUserImage() != null) {
            holder.feedImageView.setImageUrl(item.getUserImage(), imageLoader);
            holder.feedImageView.setVisibility(View.VISIBLE);
            holder.feedImageView
                    .setResponseObserver(new FeedImageView.ResponseObserver() {
                        @Override
                        public void onError() {
                        }

                        @Override
                        public void onSuccess() {
                        }
                    });
        } else {
            holder.feedImageView.setVisibility(View.GONE);
        }
        //Setting the timer adapter for the post and their respective contents
        holder.setData(item);
        return convertView;
    }
    private class ViewHolder {
        FeedItem item;
        public TextView name;
        public TextView timestamp;
        public TextView statusMsg;
        public ImageView profilePic;
        public FeedImageView feedImageView;
        public Button showTimerPost;

        public void setData(FeedItem item) {
            this.item = item;
            updateTimeRemaining(System.currentTimeMillis());
        }

        public String updateTimeRemaining(long currentTime) {

            timeDiff = (item.getPostExpiry()+400000000) - currentTime;
            if (timeDiff > 0) {

                timerFormat = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(timeDiff),
                        TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff)),
                        TimeUnit.MILLISECONDS.toSeconds(timeDiff) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeDiff)));

                showTimerPost.setText(timerFormat);
                return timerFormat;
            } else {
                //Delete feed items when post is expired
                showTimerPost.setText("Expired!");//only to explimify
            }
            return timerFormat;
        }

    }

}

0 个答案:

没有答案