当前位置:操作系统 > 安卓/Android >>

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 view  
            view.findViewById(R.id.mms_layout_view_stub).setVisibility(View.VISIBLE);  
        }  
        return view;  
    }  
 
这个view就是MessageLIstItem。然后MessagelistAdapter会调用bindView方法,完成视图的加载,在加载中,主要是调用MessageItem的bind方法。我们现在主要关心的是MessageItem对彩信内容数据的加载,以及着重注意异步加载幻灯片附件的逻辑处理。
[java]  
@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。
[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 sms  
  
            long status = cursor.getLong(columnsMap.mColumnSmsStatus);  
            if (status == Sms.STATUS_NONE) {  
                // No delivery report requested  
                mDeliveryStatus = DeliveryStatus.NONE;  
            } else if (status >= Sms.STATUS_FAILED) {  
                // Failure  
                mDeliveryStatus = DeliveryStatus.FAILED;  
            } else if (status >= Sms.STATUS_PENDING) {  
                // Pending  
                mDeliveryStatus = DeliveryStatus.PENDING;  
            } else {  
                // Success  
                mDeliveryStatus = DeliveryStatus.RECEIVED;  
            }  
  
            mMessageUri = ContentUris.withAppendedId(Sms.CONTENT_URI, mMsgId);  
            // Set contact and message body  
     
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,