【问题标题】:How can I make my list thread safe in order to use it with a custom ArrayAdapter?如何使我的列表线程安全以便与自定义 ArrayAdapter 一起使用?
【发布时间】:2016-05-11 03:42:24
【问题描述】:

在我的应用程序中,我使用 LinkedList 支持 ListView。我正在使用自定义 ArrayAdapter 来填充列表:

public class CustomArrayAdapter extends ArrayAdapter<Message> {

    Context context;
    int resource;

    public CustomArrayAdapter(Context context, int resource, List<Message> messages) {
        super(context, resource, messages);
        this.context = context;
        this.resource = resource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        MessageHolder messageHolder = null;

        if(row == null){
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(resource, parent, false);
            messageHolder = new MessageHolder();
            messageHolder.chat_information = (TextView) row.findViewById(R.id.chat_information);
            messageHolder.chat_message = (TextView) row.findViewById(R.id.chat_message);

            row.setTag(messageHolder);
        } else {
            messageHolder = (MessageHolder) row.getTag();
        }

        Message message = getItem(position);
        messageHolder.chat_information.setText(message.getSenderName() + Constants.NEWLINE + message.getSendTime());
        messageHolder.chat_message.setText(message.getMessageText());

        return row;
    }

    private class MessageHolder {
        TextView chat_information;
        TextView chat_message;
    }
}

然而,我意识到 LinkedList 不是线程安全的。我想使用ConcurrentLinkedQueueLinkedBlockingDeque,但它们只返回数组,并且适配器需要一个List。

有没有办法让这个自定义的 ArrayAdapter 使用这些线程安全方法之一,或者我需要遍历对象数组以填充要使用的列表?

【问题讨论】:

  • 这可能不完全是重复的,但看看这个 SO answer
  • 你应该只从主线程修改适配器数据。

标签: android android-arrayadapter


【解决方案1】:

java.util.Collections 类可用于包装 List,使其同步(即线程安全)。例如:

LinkedList<String> notThreadSafeList = new LinkedList<String>();
List<String> threadSafeList = Collections.synchronizedList(notThreadSafeList);

另见:

http://developer.android.com/reference/java/util/Collections.html#synchronizedList(java.util.List)

【讨论】:

    【解决方案2】:

    我最终将列表转换为使用内部 SQLite 数据库,并使用 SimpleCursorAdapter 来备份 ListView。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      相关资源
      最近更新 更多