我们开发了一款Android聊天室运用演示,应用了AppWarp(译注:Appwarp 是创建实时多用户游戏的跨平台搜集引擎),而AppWarp引擎阐明了怎么处理间歇性的搜集链接缺点。这个演示用到了AppWarp的具有搜集弹性的API。
为什么需求搜集弹性: 在Mobile配备中,数据连接不时是一个问题。 当用户在Mobile中,数据源将经常切换基站,也许在2G和3G之间晋级/升级,或切换WiFi,或由于屏幕锁定或用户按下home键使得运用次序切换到后台运转。 这对依托不时数据连接的运用次序/游戏带来影响。AppWarp 供应了 弱小的功用 来处理 搜集弹性 问题, 用户可以颠末它 在 连接损失的 情况下,保持 运用 之前的 形状 。想知道更多有关appwarp弹性:点击这里
其它翻译版本 (1) 加载中 包含两个 Activities 的运用
MainActivity: Main Activity 容许用户连接到AppWarp处事端。用户输出他们的名字然后连接到AppWarpServer。为了启用弹性特点(Resiliency Feature),你该当在初始化WarpClient当前设置默许恢复间隔(Recovery Allowance interval):
private void init(){ WarpClient.initialize(Constants.apiKey, Constants.secretKey); WarpClient.setRecoveryAllowance(120); try { theClient = WarpClient.getInstance(); } catch (Exception ex) { Toast.makeText(this, "Exception in Initilization", Toast.LENGTH_LONG).show(); } }
这会告诉Server默许恢停工夫间隔,在这个时间内,即使在连接损失的情况下,处事端也不会销毁用户session。我们用AppHq 操纵台创建了一个静态变量room。一旦连接并注册到这个room,我们就转向ChatActivity。
public static final String roomId = "1469583531"; // static room id defined in Constant.java @Override public void onSubscribeRoomDone(RoomEvent event) { if(event.getResult()==WarpResponseResultCode.SUCCESS){ Intent intent = new Intent(this, ChatActivity.class); startActivity(intent); }else{ showToastOnUIThread("onSubscribeRoomDone Failed with ErrorCode: "+event.getResult()); } }
ChatActivity.java 这个 Activity 包含了发送/采取聊天逻辑,并且也管理聊天日志。上半部分包含了一致个room中参与用户的列表。绿色的形状教唆意思是用户在线,灰色的意思是暂停(临时连接错误)。屏幕下半部分包含了用户发送的聊天记录。在这个activity的启动后,要想取得房间中的在线用户,我们可以调用
theClient.getLiveRoomInfo(Constants.roomId);随着onGetLiveRoomInfoDone的照应举动, 我们在用户列表适配器中参与参与用户。
public void onGetLiveRoomInfoDone(final LiveRoomInfoEvent event) { if(event.getResult()==WarpResponseResultCode.SUCCESS){ onlineUserList.clear(); if(event.getJoinedUsers().length>1){// if more than one user is online final String onlineUser[] = Utils.removeLocalUserNameFromArray(event.getJoinedUsers()); for(int i=0;i<onlineUser.length;i++){ User user = new User(onlineUser[i].toString(), true); Log.d(onlineUser[i].toString(), onlineUser[i].toString()); onlineUserList.add(user); } resetAdapter(); }else{ showToastOnUIThread("No online user found"); } }else{ showToastOnUIThread("onGetLiveRoomInfoDone Failed with ErrorCode: "+event.getResult()); } }其它翻译版本 (1) 加载中
处理连接弹性:在任何启事任何用户与AppWarpServer连接中断的状况下,处事端将坚持连接直到预定义的恢停工夫,不过它会给房间中的其他用户发送一个通知,通知某用户当前处于暂停形状。假设用户在定义的弹性时间内恢复连接形状,那么其他用户将获得该用户形状继续的通知。否则用户将收到OnUserLeftRoom通知,并且将该用户从OnlineUser列表中删除。维护暂停/继续形状:假设我们应用AppWarp弹性特点,在任何用户与AppWarpServer中断连接时,我们将收到一个通知。
@Override public void onUserPaused(String locid, boolean isLobby, String userName) { for(int i=0;i<onlineUserList.size();i++){ User user = onlineUserList.get(i); if(user.getName().equals(userName)){ user.setStatus(false); } } resetAdapter(); } @Override public void onUserResumed(String locid, boolean isLobby, String userName) { for(int i=0;i<onlineUserList.size();i++){ User user = onlineUserList.get(i); if(user.getName().equals(userName)){ user.setStatus(true); } } resetAdapter(); }其它翻译版本 (1) 加载中 恢复连接:假设用户的搜集连接由于某些启事中断了,比如在2G/3G/WiFi/towers之间履行切换,也许其它启事,我们会在ConnectonRequestListener中失掉一个连接错误,其错误代码为WarpResponseResultCode.CONNECTION_ERROR_RECOVERABLE,颠末检测该错误代码我们可以调用恢复连接的API来恢复我们之间的session。我们建议每隔5秒钟检验测验履行一次重新连接。
theClient.RecoverConnection(); @Override public void onConnectDone(final ConnectEvent event) { if(event.getResult() == WarpResponseResultCode.SUCCESS){ showToastOnUIThread("Connection success"); } else if(event.getResult() == WarpResponseResultCode.SUCCESS_RECOVERED){ showToastOnUIThread("Connection recovered"); runOnUiThread(new Runnable() { @Override public void run() { if(progressDialog!=null){ progressDialog.dismiss(); } progressDialog = ProgressDialog.show(ChatActivity.this, "", "Please wait.."); } }); theClient.getLiveRoomInfo(Constants.roomId); } else if(event.getResult() == WarpResponseResultCode.CONNECTION_ERROR_RECOVERABLE){ runOnUiThread(new Runnable() { @Override public void run() { progressDialog = ProgressDialog.show(ChatActivity.this, "", "Recoverable connection error. Recovering session after 5 seconds"); } }); handler.postDelayed(new Runnable() { @Override public void run() { progressDialog.setMessage("Recovering..."); theClient.RecoverConnection(); } }, 5000); } else{ showToastOnUIThread("Non-recoverable connection error."+event.getResult()); handleLeaveRoom(); this.finish(); } }源代码可以从我们的 git库出息行下载或反省。假设你有什么问题也许需求进一步的协助,请随时跟我们联系: support@shephertz.com。 本文中的一切译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译Task依照 CC 协议,假设我们的Task有侵犯到您的权益,请及时联系我们。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务