歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

記不清是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