`

人人网SDK Demo项目学习 异步发送信息

 
阅读更多

感觉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做的都不错








分享到:
评论

相关推荐

    发那科CNC SDK Demo源码,Focas1_2 SDK Demo source code,,C#

    综上所述,这个压缩包提供的Focas 1.2 SDK Demo源码是学习和开发FANUC CNC系统应用程序的重要资源。通过研究和实践,开发者可以掌握与FANUC CNC进行通讯的关键技术和方法,从而提升自动化制造流程的效率和灵活性。

    微信JS-SDK Demo.rar_DEMO_微信_微信JS-SDK Demo_微信js sdk_微信扫一扫

    微信JS-SDK Demo 摘录微信调用扫一扫功能的实现

    SDKdemo使用指导.pdf

    SDKdemo则是海康威视提供的一个示例程序,它包含了基本的设备控制、视频流处理等功能,帮助开发者快速理解和学习如何使用SDK。本文将详细介绍如何下载和使用海康SDKdemo。 一、SDKdemo的下载 海康SDK的下载可以...

    大华SDK demo源码

    例如,当检测到入侵或其他异常情况时,SDK会触发相应的报警机制,通过网络发送报警信息或执行预设的联动动作。 5. **网络通信**:大华SDK可能集成了TCP/IP、UDP等网络协议,使得开发者能够通过网络连接和控制远程...

    百度地图sdkdemo

    SDKDemo中包含了各种地图渲染示例,如基本地图展示、卫星地图切换、昼夜模式切换等,这些都是构建地图应用不可或缺的部分。 **定位服务**是百度地图SDK的一大亮点。它提供了强大的定位能力,包括GPS定位、网络定位...

    百度地图SDK DEMO

    【百度地图SDK DEMO】是开发者使用百度地图服务的一个示例程序,它包含了各种功能的演示,便于开发者理解和学习如何集成百度地图API到自己的应用程序中。这个DEMO可以帮助开发者快速上手,理解百度地图SDK的基本用法...

    大华播放库SDK-Demo(不是设备网络库NetSDK)

    “播放库SDK”可以从官网下载到,只不过只有C++的demo,想用其它语言做二次开发有点麻烦。 “设备网络库NetSDK”在官网上能下载到各种开发语言的Demo,非常方便做二次开发。如果是用C#开发,官网下载的是WinForms的...

    百度地图SDK Demo学习

    根据百度官方文档:http://lbsyun.baidu.com/index.php?title=首页学习所写的百度地图SDK Demo

    sdk2000 demo for c#

    3. 异步编程:为了优化性能,许多SDK接口设计为异步操作,开发者需要理解如何正确处理异步回调和结果。 三、示例应用"SDK2000Demo(C#_2009_7_3)"可能包含的内容: 1. 设备搜索与连接示例:演示如何在C#程序中搜索...

    海康威视网络摄像机 SDK DEMO

    通过学习和理解海康威视网络摄像机SDK DEMO,开发者可以了解到如何与网络摄像机进行通信,实现监控系统的各种功能。这对于构建定制化的安防系统、智能家居或其他需要远程视频监控的场景具有重要价值。

    世达龙多拍仪接口sdk Demo.zip

    世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo.世达龙多拍仪接口sdk Demo....

    高德定位sdkDemo

    【高德定位SDK Demo详解】 高德定位SDK是一款由高德地图提供的开发工具包,它为开发者提供了在Android和iOS平台上实现精准、高效定位的能力。本文将深入解析高德定位SDK Demo,帮助开发者理解如何集成并使用这个SDK...

    个推SDK Demo

    "个推SDK Demo"是一个展示如何在应用中集成和使用个推服务的示例项目。个推(Getui)是中国领先的移动互联网推送服务提供商,它为开发者提供了高效、稳定的推送解决方案,帮助他们实现向用户精准推送消息的功能。...

    微信官方SDKDemo

    微信官方SDKDemo是一款针对iOS平台的应用程序开发工具包,它为开发者提供了丰富的接口,以便将微信的功能集成到自己的应用中。这个SDKDEMO包含了多个示例,演示了如何使用微信SDK来实现各种功能,如分享文字、图片...

    大华SDK,包含 JAVA版DEMO

    通过分析和学习这些DEMO,开发者可以快速理解SDK的工作原理和调用方式。DEMO通常包括了设备连接、视频流获取、图像处理、事件处理等功能模块,帮助开发者掌握API的使用。 大华SDK中的核心组件可能包括以下几个部分...

    海康SDK的DEMO

    这篇描述提到的DEMO是海康SDK的一个示例项目,它展示了SDK支持的各种功能,帮助开发者快速理解和学习如何利用这些功能。 1. **SDK基本概念**:SDK是一组接口和库文件,包含必要的文档、代码示例和工具,使得开发者...

    阿里百川的SDKDemo

    阿里百川的SDKDemo是一个专为开发者设计的集成工具,主要涵盖了阿里百川提供的即时通讯OpenIM服务。这个SDK旨在简化Android应用中的聊天功能开发,让开发者能够快速、高效地在自己的应用程序中实现丰富的沟通体验。 ...

    人人网android平台开发SDK

    这个SDK封装了人人网第二版的开发API,使得开发者能够轻松实现用户登录、分享内容、获取好友信息、发布动态等功能,极大地提高了开发效率。 一、SDK核心功能 1. 用户授权与登录:SDK提供了完整的用户授权流程,...

    海康 最新的 sdk demo c++

    通过分析和运行这个DEMO,开发者可以快速了解SDK的工作流程,学习如何将SDK集成到自己的项目中。DEMO通常包括设备搜索、连接、断开、视频预览、录像回放等功能。 `MultiLanguageDemo`目录则可能包含支持多语言的...

    如何使用海康SDK实现异步登录网络摄像机(IPC)【源码】【监控】【录播】【NVR】

    通过阅读和分析代码,开发者可以更好地理解海康IPC的异步登录流程,并将其应用到自己的项目中。示例工程通常包括了所有必要的API调用、错误处理机制以及回调函数的实现,是学习和实践的好材料。 总的来说,掌握海康...

Global site tag (gtag.js) - Google Analytics