我怎样才能使我的列表线程安全以便将它与自定义 ArrayAdapter 一起使用?
How can I make my list thread safe in order to use it with a custom ArrayAdapter?
在我的应用程序中,我支持带有 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 不是线程安全的。我想使用 ConcurrentLinkedQueue or LinkedBlockingDeque,但它们只有 return 数组,并且适配器需要一个列表。
是否有任何方法可以调整此自定义 ArrayAdapter 以使用这些线程安全方法之一,或者我是否需要遍历对象数组以填充要使用的列表?
java.util.Collections class 可用于包装 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)
我最终将列表转换为使用内部 SQLite 数据库,并使用 SimpleCursorAdapter 来备份 ListView。
在我的应用程序中,我支持带有 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 不是线程安全的。我想使用 ConcurrentLinkedQueue or LinkedBlockingDeque,但它们只有 return 数组,并且适配器需要一个列表。
是否有任何方法可以调整此自定义 ArrayAdapter 以使用这些线程安全方法之一,或者我是否需要遍历对象数组以填充要使用的列表?
java.util.Collections class 可用于包装 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)
我最终将列表转换为使用内部 SQLite 数据库,并使用 SimpleCursorAdapter 来备份 ListView。