感觉renren SDK的异步发送消息机制不是很好,其实不能这么说.为什么呢?看下文
先来介绍一下
它使用了一个异步类来处理请求数据,上传数据等的操作 ,这个类在sdk的AsyncRenren 以及他的辅助类StatusHelper等里面,这些异步类通过线程池的方式进行耗时操作 在demo中调用这个异步类发送数据,
那发送的数据怎么通知UI更新呢?于是使用了一个listener 在demo的Activity中定义一个listener继承自sdk中的listener 这样sdk中的类就可以调用出入的listener进而操作UI了
拿发送状态为例
在 StatusPublishActivity中,有
StatusSetRequestParam param = new StatusSetRequestParam(status
.getText().toString().trim());
StatusSetListener listener = new StatusSetListener(
StatusPublishActivity.this);
try {
AsyncRenren aRenren = new AsyncRenren(renren);
aRenren.publishStatus(param, listener, // 对结果进行监听
true); // 若超过140字符,则自动截短
} catch (Throwable e) {
String errorMsg = e.getMessage();
response.setText(errorMsg);
}
这个代码调用了AsyRenren的.publishStatus()方法
我们看一下这个方法
public void publishStatus(StatusSetRequestParam status,
AbstractRequestListener<StatusSetResponseBean> listener,
boolean truncOption) {
StatusHelper helper = new StatusHelper(renren);
helper.asyncPublish(pool, status, listener, truncOption);
}
他生成一个StatusHelper类实例来进行发送操作
/**
* 异步发送状态的方法
*
* @param pool
* 执行发送状态操作的线程池
* @param status
* 要发布的状态对象
* @param listener
* 用以监听发布状态结果的监听器对象
* @param truncOption
* 若超出了长度,是否自动截短至140个字
*/
public void asyncPublish(Executor pool,
final StatusSetRequestParam status,
final AbstractRequestListener<StatusSetResponseBean> listener,
final boolean truncOption) {
pool.execute(new Runnable() {
@Override
public void run() {
try {
StatusSetResponseBean stat = publish(status);
if(listener != null) {
listener.onComplete(stat);
}
} catch (RenrenException rre) { // 参数、服务器等错误或异常
Util.logger(rre.getMessage());
if (listener != null) {
listener.onRenrenError(new RenrenError(rre
.getErrorCode(), rre.getMessage(), rre
.getOrgResponse()));
}
} catch (Throwable t) { // 运行时异常
Util.logger(t.getMessage());
if (listener != null) {
listener.onFault(t);
}
}
}
});
}
这个方法是真正的操作发送微博的方法了,而且把结果通过listener传回去
所以demo要是想listener来完成各种发送结果的处理,使用handler.post方法来处理显示结果的UI
/**
* 监听异步调用发送状态接口的响应
*
* @author Shaofeng Wang (shaofeng.wang@renren-inc.com)
*/
private class StatusSetListener extends
AbstractRequestListener<StatusSetResponseBean> {
private Context context;
private Handler handler;
public StatusSetListener(Context context) {
this.context = context;
this.handler = new Handler(context.getMainLooper());
}
@Override
public void onRenrenError(RenrenError renrenError) {
final int errorCode = renrenError.getErrorCode();
final String errorMsg = renrenError.getMessage();
handler.post(new Runnable() {
@Override
public void run() {
if (StatusPublishActivity.this != null) {
publishButton.setEnabled(true);
response.setText(errorMsg);
if (progress != null) {
progress.dismiss();
}
}
if (errorCode == RenrenError.ERROR_CODE_OPERATION_CANCELLED) {
Toast.makeText(context, "发送被取消", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(context, "发送失败", Toast.LENGTH_SHORT)
.show();
}
}
});
}
@Override
public void onFault(Throwable fault) {
final String errorMsg = fault.toString();
handler.post(new Runnable() {
@Override
public void run() {
if (StatusPublishActivity.this != null) {
publishButton.setEnabled(true);
response.setText(errorMsg);
if (progress != null) {
progress.dismiss();
}
}
Toast.makeText(context, "发送失败", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onComplete(StatusSetResponseBean bean) {
final String responseStr = bean.toString();
handler.post(new Runnable() {
@Override
public void run() {
if (StatusPublishActivity.this != null) {
response.setText(responseStr);
publishButton.setEnabled(true);
if (progress != null) {
progress.dismiss();
}
}
Toast.makeText(context, "发送成功", Toast.LENGTH_SHORT).show();
}
});
}
}
这样就异步完成了发送并显示结果的操作
不得不承认这个架构写的很好,很值得在cs结构的android应用中尝试.
但是我们也看到了这个架构的小问题
sdk和demo耦合他密切,如果不知道sdk源码,只靠demo恐怕很难写出发送微博的代码,sdk个人认为应该是封装成几个接口,使用这只管调用,而不是需要两者各种复杂的交互
其实sdk的工作应该是提供一个renren类 里面有各种方法 异步让开发者自己搞就可以了
个人感觉吧,这一点腾讯2.0 和新浪1.0做的都不错
分享到:
相关推荐
综上所述,这个压缩包提供的Focas 1.2 SDK Demo源码是学习和开发FANUC CNC系统应用程序的重要资源。通过研究和实践,开发者可以掌握与FANUC CNC进行通讯的关键技术和方法,从而提升自动化制造流程的效率和灵活性。
微信JS-SDK Demo 摘录微信调用扫一扫功能的实现
SDKdemo则是海康威视提供的一个示例程序,它包含了基本的设备控制、视频流处理等功能,帮助开发者快速理解和学习如何使用SDK。本文将详细介绍如何下载和使用海康SDKdemo。 一、SDKdemo的下载 海康SDK的下载可以...
例如,当检测到入侵或其他异常情况时,SDK会触发相应的报警机制,通过网络发送报警信息或执行预设的联动动作。 5. **网络通信**:大华SDK可能集成了TCP/IP、UDP等网络协议,使得开发者能够通过网络连接和控制远程...
SDKDemo中包含了各种地图渲染示例,如基本地图展示、卫星地图切换、昼夜模式切换等,这些都是构建地图应用不可或缺的部分。 **定位服务**是百度地图SDK的一大亮点。它提供了强大的定位能力,包括GPS定位、网络定位...
【百度地图SDK DEMO】是开发者使用百度地图服务的一个示例程序,它包含了各种功能的演示,便于开发者理解和学习如何集成百度地图API到自己的应用程序中。这个DEMO可以帮助开发者快速上手,理解百度地图SDK的基本用法...
“播放库SDK”可以从官网下载到,只不过只有C++的demo,想用其它语言做二次开发有点麻烦。 “设备网络库NetSDK”在官网上能下载到各种开发语言的Demo,非常方便做二次开发。如果是用C#开发,官网下载的是WinForms的...
根据百度官方文档:http://lbsyun.baidu.com/index.php?title=首页学习所写的百度地图SDK Demo
3. 异步编程:为了优化性能,许多SDK接口设计为异步操作,开发者需要理解如何正确处理异步回调和结果。 三、示例应用"SDK2000Demo(C#_2009_7_3)"可能包含的内容: 1. 设备搜索与连接示例:演示如何在C#程序中搜索...
通过学习和理解海康威视网络摄像机SDK DEMO,开发者可以了解到如何与网络摄像机进行通信,实现监控系统的各种功能。这对于构建定制化的安防系统、智能家居或其他需要远程视频监控的场景具有重要价值。
世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo....
【高德定位SDK Demo详解】 高德定位SDK是一款由高德地图提供的开发工具包,它为开发者提供了在Android和iOS平台上实现精准、高效定位的能力。本文将深入解析高德定位SDK Demo,帮助开发者理解如何集成并使用这个SDK...
"个推SDK Demo"是一个展示如何在应用中集成和使用个推服务的示例项目。个推(Getui)是中国领先的移动互联网推送服务提供商,它为开发者提供了高效、稳定的推送解决方案,帮助他们实现向用户精准推送消息的功能。...
微信官方SDKDemo是一款针对iOS平台的应用程序开发工具包,它为开发者提供了丰富的接口,以便将微信的功能集成到自己的应用中。这个SDKDEMO包含了多个示例,演示了如何使用微信SDK来实现各种功能,如分享文字、图片...
通过分析和学习这些DEMO,开发者可以快速理解SDK的工作原理和调用方式。DEMO通常包括了设备连接、视频流获取、图像处理、事件处理等功能模块,帮助开发者掌握API的使用。 大华SDK中的核心组件可能包括以下几个部分...
这篇描述提到的DEMO是海康SDK的一个示例项目,它展示了SDK支持的各种功能,帮助开发者快速理解和学习如何利用这些功能。 1. **SDK基本概念**:SDK是一组接口和库文件,包含必要的文档、代码示例和工具,使得开发者...
阿里百川的SDKDemo是一个专为开发者设计的集成工具,主要涵盖了阿里百川提供的即时通讯OpenIM服务。这个SDK旨在简化Android应用中的聊天功能开发,让开发者能够快速、高效地在自己的应用程序中实现丰富的沟通体验。 ...
这个SDK封装了人人网第二版的开发API,使得开发者能够轻松实现用户登录、分享内容、获取好友信息、发布动态等功能,极大地提高了开发效率。 一、SDK核心功能 1. 用户授权与登录:SDK提供了完整的用户授权流程,...
通过分析和运行这个DEMO,开发者可以快速了解SDK的工作流程,学习如何将SDK集成到自己的项目中。DEMO通常包括设备搜索、连接、断开、视频预览、录像回放等功能。 `MultiLanguageDemo`目录则可能包含支持多语言的...
通过阅读和分析代码,开发者可以更好地理解海康IPC的异步登录流程,并将其应用到自己的项目中。示例工程通常包括了所有必要的API调用、错误处理机制以及回调函数的实现,是学习和实践的好材料。 总的来说,掌握海康...