android短彩信幻灯片异步加载机制
记不清是android 4.0之后还是4.1之后,浏览信息时,彩信幻灯片不再随着信息内容一并显示,而是在信息内容显示后,开启后台线程,异步加载彩信幻灯片,加载完毕之后再显示附件。为什么要这么设计那?主要是为了解决彩信显示缓慢的问题。在原先的设计中,彩信想要显示,首先要做准备工作,准备工作包括从数据库中加载信息的内容,收件人,发送时间,主题,类型,状态报告等基础内容,其中还包括了一项费时的操作,那就是加载彩信幻灯片附件。只有上述工作全部完成之后彩信才会显示在界面上,用户才可以进行浏览。这种设计非常容易卡机,有时还会引起ANR(应用程序无相应),尤其当我们的运营商要求彩信幻灯片支持20页(默认10页),这个问题就更加严重,长时间不显示信息,严重影响性能。其实从功能设计上来说,用户首先希望看到的是彩信收件人,彩信主题,发送时间,发送状态报告等基础信息,然后才会选择查看幻灯片等多媒体附件。我们完全可以将幻灯片的加载滞后。androd目前给出了这样的一个设计。首先根据当前回话,查询数据库,加载信息条目。每一个信息条目,每一条信息条目,用视图MessageListItem来显示,信息内容数据包装在MessageItem中。MessageListAdapter.java[java]public View newView(Context context, Cursor cursor, ViewGroup parent) {int boxType = getItemViewType(cursor);View view = mInflater.inflate((boxType == INCOMING_ITEM_TYPE_SMS ||boxType == INCOMING_ITEM_TYPE_MMS) ?R.layout.message_list_item_recv : R.layout.message_list_item_send,parent, false);if (boxType == INCOMING_ITEM_TYPE_MMS || boxType == OUTGOING_ITEM_TYPE_MMS) {// We've got an mms item, pre-inflate the mms portion of the viewview.findViewById(R.id.mms_layout_view_stub).setVisibility(View.VISIBLE);}return view;}这个view就是MessageLIstItem。然后MessagelistAdapter会调用bindView方法,完成视图的加载,在加载中,主要是调用MessageItem的bind方法。我们现在主要关心的是MessageItem对彩信内容数据的加载,以及着重注意异步加载幻灯片附件的逻辑处理。[java]@Overridepublic void bindView(View view, Context context, Cursor cursor) {if (<strong>view instanceof MessageListItem</strong>) {String type = cursor.getString(mColumnsMap.mColumnMsgType);long msgId = cursor.getLong(mColumnsMap.mColumnMsgId);<strong>MessageItem msgItem = getCachedMessageItem(type, msgId, cursor);</strong>if (msgItem != null) {MessageListItem mli = (MessageListItem) view;int position = cursor.getPosition();mli.bind(msgItem, position == cursor.getCount() - 1, position);mli.setMsgListItemHandler(mMsgListItemHandler);}}}根据信息的type以及msgId,通过getCachedMessageItem方法,得到一个MessageItem。[java]public MessageItem getCachedMessageItem(String type, long msgId, Cursor c) {MessageItem item = mMessageItemCache.get(getKey(type, msgId));if (item == null && c != null && isCursorValid(c)) {try {<strong>item = new MessageItem(mContext, type, c, mColumnsMap, mHighlight, mFullTimestamp, mSentTimestamp);</strong>mMessageItemCache.put(getKey(item.mType, item.mMsgId), item);} catch (MmsException e) {Log.e(TAG, "getCachedMessageItem: ", e);}}return item;}在MessageItem中会对cursor中的数据进行加载。MessgeItem.java[java]MessageItem(Context context, String type, final Cursor cursor,final ColumnsMap columnsMap, Pattern highlight, boolean fullTimestamp, boolean sentTimestamp) throws MmsException {mContext = context;mMsgId = cursor.getLong(columnsMap.mColumnMsgId);mHighlight = highlight;mType = type;mCursor = cursor;mColumnsMap = columnsMap;mFullTimestamp = fullTimestamp;mSentTimestamp = sentTimestamp;if ("sms".equals(type)) {mReadReport = false; // No read reports in smslong status = cursor.getLong(columnsMap.mColumnSmsStatus);if (status == Sms.STATUS_NONE) {// No delivery report requestedmDeliveryStatus = DeliveryStatus.NONE;} else if (status >= Sms.STATUS_FAILED) {// FailuremDeliveryStatus = DeliveryStatus.FAILED;} else if (status >= Sms.STATUS_PENDING) {// PendingmDeliveryStatus = DeliveryStatus.PENDING;} else {// SuccessmDeliveryStatus = DeliveryStatus.RECEIVED;}mMessageUri = ContentUris.withAppendedId(Sms.CONTENT_URI, mMsgId);// Set contact and message body补充:移动开发 , Android ,
上一个:仿微信聊天气泡效果实现
下一个:Android 工程中各种文件的介绍