歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android短彩信幻燈片異步加載機制

Android短彩信幻燈片異步加載機制

日期:2017/3/1 9:59:48   编辑:Linux編程

記不清是Android 4.0之後還是4.1之後,浏覽信息時,彩信幻燈片不再隨著信息內容一並顯示,而是在信息內容顯示後,開啟後台線程,異步加載彩信幻燈片,加載完畢之後再顯示附件。為什麼要這麼設計那?主要是為了解決彩信顯示緩慢的問題。在原先的設計中,彩信想要顯示,首先要做准備工作,准備工作包括從數據庫中加載信息的內容,收件人,發送時間,主題,類型,狀態報告等基礎內容,其中還包括了一項費時的操作,那就是加載彩信幻燈片附件。只有上述工作全部完成之後彩信才會顯示在界面上,用戶才可以進行浏覽。這種設計非常容易卡機,有時還會引起ANR(應用程序無相應),尤其當我們的運營商要求彩信幻燈片支持20頁(默認10頁),這個問題就更加嚴重,長時間不顯示信息,嚴重影響性能。其實從功能設計上來說,用戶首先希望看到的是彩信收件人,彩信主題,發送時間,發送狀態報告等基礎信息,然後才會選擇查看幻燈片等多媒體附件。我們完全可以將幻燈片的加載滯後。androd目前給出了這樣的一個設計。

首先根據當前回話,查詢數據庫,加載信息條目。每一個信息條目,每一條信息條目,用視圖MessageListItem來顯示,信息內容數據包裝在MessageItem中。

MessageListAdapter.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 view
view.findViewById(R.id.mms_layout_view_stub).setVisibility(View.VISIBLE);
}
return view;
}

這個view就是MessageLIstItem。然後MessagelistAdapter會調用bindView方法,完成視圖的加載,在加載中,主要是調用MessageItem的bind方法。我們現在主要關心的是MessageItem對彩信內容數據的加載,以及著重注意異步加載幻燈片附件的邏輯處理。

@Override
public 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。

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

Copyright © Linux教程網 All Rights Reserved