Android4.2
程序读取数据库中短彩信后用ListView来显示信息,所显示用的适配器为MessageListAdapter。
在适配器的bindView方法中构建MessageItem对象,此对象存储了cursor里的所以信息。每一条View是MessageListItem,MessageListItem调用bind方法把MessageItem传递进去。
bind方法中,一般情况走bindCommonMessage(sameItem)方法。bindCommonMessage方法中短信与彩信在显示文字流程中一致。之后如果是短信则隐藏MMS相关的View。
彩信的加载:
由于彩信的MessageItem在构造时并没有对mSlideshow赋值,在bindCommonMessage方法中,如果mSlideshow==null,则注册PduLoadedCallback接口。而在MessageItem构造时:
mItemLoadedFuture = MmsApp.getApplication().getPduLoaderManager()
.getPdu(mMessageUri, loadSlideshow,
new PduLoadedMessageItemCallback());
在第一次调用getPdu方法时,在PduTask这个Runnable内调用了接口方法,一直回调到bindCommonMessage方法内注册的那个接口方法,方法里又调用了bindCommonMessage方法一次,这次mSlideshow不再为空走else流程显示View.
在getPdu方法内会把SlideshowModel以uri为key存在缓存内,之后访问不再走PduTask,而是直接调用接口方法。注意:缓存PduCache在代码中没有put,其实在PduTask方法的mPduPersister.load(mUri)里put了,单例模式。
第一次打开彩信时bindCommonMessage被调用了3次,其中bindView被调用两次,第一次时启动了PduTask,而Contact调用了接口方法onUpdata导致在主界面的onUpdata方法被调用,进而调用了适配器的刷新,而刷新会导致存在缓存中的MessageItem被清空,从而又构造了一遍MessageItem。待主线程方法执行完后PduTask启动执行。
点击事件:
在ComposeMessageActivity类中给ListView注册了点击事件
mMsgListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (view != null) {
((MessageListItem) view).onMessageListItemClick();
}
}
});
而在彩信流程中的drawPlaybackButton方法中又注册了一次,不过调用的方法相同。在此方法中注册了中心播放按钮mSlideShowButton的点击事件。
setOnClickListener方法中注册了附件图片的点击与长按事件。
长按事件:
mMsgListView.setOnCreateContextMenuListener(mMsgListMenuCreateListener);