来电呼入时的各种信息显示都是在CallCard.java中实现的,其中的updateDisplayForPerson是主角。updateDisplayForPerson会根据电话的当前状态来更改名字号码等信息的显示。图片的替换代码如下:
而sThreadHandler是一个WorkerHandler对象:
最后会由mResultHandler的handleMessage()来处理,在这里,调用了CallCard.java的回调函数onImageLoadComplete()来进行图片的显示:
ContactsAsyncHelper.startObtainPhotoAsync(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE,
getContext(), personUri, this, new AsyncLoadCookie(mPhoto, info, call));
在startObtainPhotoAsync()中有:
Message msg = sThreadHandler.obtainMessage(token);
msg.arg1 = EVENT_LOAD_IMAGE;
msg.obj = args;
if (DBG) Log.d(LOG_TAG, "Begin loading image: " + args.uri +
", displaying default image for now.");
// notify the thread to begin working
sThreadHandler.sendMessage(msg);
而sThreadHandler是一个WorkerHandler对象:
sThreadHandler = new WorkerHandler(thread.getLooper());
则sThreadHandler.sendMessage(msg)后续会由WorkerHandler的handleMessage()来处理:
case EVENT_LOAD_IMAGE:
InputStream inputStream = null;
try {
inputStream = Contacts.openContactPhotoInputStream(
args.context.getContentResolver(), args.uri, true);
} catch (Exception e) {
Log.e(LOG_TAG, "Error opening photo input stream", e);
}
if (inputStream != null) {
args.photo = Drawable.createFromStream(inputStream, args.uri.toString());
// This assumes Drawable coming from contact database is usually
// BitmapDrawable and thus we can have (down)scaled version of it.
args.photoIcon = getPhotoIconWhenAppropriate(args.context, args.photo);
if (DBG) Log.d(LOG_TAG, "Loading image: " + msg.arg1 +
" token: " + msg.what + " image URI: " + args.uri);
} else {
args.photo = null;
args.photoIcon = null;
if (DBG) Log.d(LOG_TAG, "Problem with image: " + msg.arg1 +
" token: " + msg.what + " image URI: " + args.uri +
", using default image.");
}
break;
default:
Message reply = ContactsAsyncHelper.this.mResultHandler.obtainMessage(msg.what);
reply.arg1 = msg.arg1;
reply.obj = msg.obj;
reply.sendToTarget();
最后会由mResultHandler的handleMessage()来处理,在这里,调用了CallCard.java的回调函数onImageLoadComplete()来进行图片的显示:
case EVENT_LOAD_IMAGE:
if (args.listener != null) {
if (DBG) {
Log.d(LOG_TAG, "Notifying listener: " + args.listener.toString() +
" image: " + args.uri + " completed");
}
args.listener.onImageLoadComplete(msg.what, args.photo, args.photoIcon,
args.cookie);
}
break;