Android 网络通信架构学习

最近跟着云课堂上的极客学院做安卓APP,学习了课程里面介绍的一种网络通信架构。清晰明了,比我自己东一块西一块拼凑出来的要好很多。在这里记录一下。

 

云课堂的连接:http://study.163.com/course/courseMain.htm?courseId=917001

 

目录:

一、Android端实现

1.1 架构图

1.2 NetworkConnection.java实现

1.3 Logic.java实现

1.4 Activity.java实现

二、测试

2.1 服务器配置

2.2 结果

 

==============================

正文

1.1 架构图

NetworkConnection.java里面实现的,就是网络通信的内容。他不负责任何逻辑处理,只提供网络通信,将逻辑处理过程通过回调函数的方式留给上层的Logic.java实现

Logic.java针对具体的处理事件,实现处理逻辑,如数据的处理,网络通信成功或失败的后续处理等。与界面的交流等主要通过回调函数,留给Activity.java实现

Activity.java是界面类,主要获取界面内容和更新界面,通过实现Logic.java 的回调函数进行页面的更新。

以一个登陆的例子,其源代码组织如图:

 

1.2 NetworkConnection.java的实现

package com.example.networkarch.net;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;import android.os.AsyncTask;public class NetConnection {public NetConnection(final String url,final HttpMethod method,final SuccessCallback successCallback,final FailCallback failCallback,final String ... kvs){System.out.println("4");new AsyncTask<Void, Void, String>() {@Overrideprotected String doInBackground(Void... arg0) {StringBuffer paramsStr = new StringBuffer();for(int i  = 0; i < kvs.length; i += 2){paramsStr.append(kvs[i]).append("+").append(kvs[i+1]).append("&");}URLConnection uc;try {switch (method) {case POST:uc = new URL(url).openConnection();uc.setDoOutput(true);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(uc.getOutputStream()));bw.write(paramsStr.toString());bw.flush();break;default:uc = new URL(url + "?" + paramsStr.toString()).openConnection();break;}BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));String line = null;StringBuffer result = new StringBuffer();while((line = br.readLine()) != null){result.append(line);}System.out.println("++result: "+result.toString());return result.toString();} catch (MalformedURLException e) {// TODO Auto-generated catch block
                    e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block
                    e.printStackTrace();}return null;}protected void onPostExecute(String result){if(result != null){if(successCallback != null){successCallback.onSuccess(result);}}else{if(failCallback != null){failCallback.onFail();}}super.onPostExecute(result);}}.execute();}public static interface SuccessCallback{void onSuccess(String result);}public static interface FailCallback{void onFail();}}

1.3 Logic.java的实现

package com.example.networkarch.logic;import org.json.JSONException;
import org.json.JSONObject;import com.example.networkarch.Config;
import com.example.networkarch.net.HttpMethod;
import com.example.networkarch.net.NetConnection;public class Login {public Login(String username,String password,final SuccessCallback successCallback,final FailCallback failCallback){System.out.println("3");new NetConnection(Config.SERVER_URL, HttpMethod.POST,new NetConnection.SuccessCallback() {@Overridepublic void onSuccess(String result) {if(successCallback != null){try {System.out.println("result: "+result);JSONObject jsonObject = new JSONObject(result);System.out.println("5");switch (jsonObject.getInt(Config.KEY_STATUS)) {case Config.RESULT_STATUS_SUCCESS:if(successCallback != null){successCallback.onSuccess(jsonObject.getString(Config.VAULE_RESULT));}break;default:if(failCallback != null){failCallback.onFail();}break;}} catch (JSONException e) { e.printStackTrace();if(failCallback != null){failCallback.onFail();}}}}},new NetConnection.FailCallback() {@Overridepublic void onFail() {if(failCallback != null){failCallback.onFail();}}}, "action", "login", "username", username, "password", password);}public static interface SuccessCallback{void onSuccess(String result);}public static interface FailCallback{void onFail();}
}

1.4 Activity.java的实现

package com.example.networkarch;import com.example.networkarch.aty.ATYHome;
import com.example.networkarch.logic.Login;import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.os.Build;public class MainActivity extends ActionBarActivity {private EditText username;private EditText password;private Button loginButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);username = (EditText)findViewById(R.id.et_username);password = (EditText)findViewById(R.id.et_password);loginButton = (Button)findViewById(R.id.bt_login);loginButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {//final ProgressDialog pd  = ProgressDialog.show(MainActivity.this, "Login...", "Please wait");
                System.out.println("2");new Login(username.getText().toString(), password.getText().toString(), new Login.SuccessCallback() {@Overridepublic void onSuccess(String result) {Intent intent = new Intent(MainActivity.this, ATYHome.class);intent.putExtra(Config.KEY_RESULT, result);startActivity(intent);finish();}}, new Login.FailCallback() {@Overridepublic void onFail() {Toast.makeText(MainActivity.this, "Sorry", Toast.LENGTH_LONG).show();}});}});}}

另外补充两个在代码里面用到的代码:

package com.example.networkarch;public class Config {public static final String SERVER_URL = "http://192.168.1.13:80/NetworkTest/test";public static final int RESULT_STATUS_SUCCESS = 2;public static final int RESULT_STATUS_FAIL = 1;public static final String KEY_STATUS = "status";public static final String KEY_RESULT = "result";public static final String VAULE_RESULT = "result";}
package com.example.networkarch.net;public enum HttpMethod {POST,GET
}

APP需要上网的权限,在Manifest.xml文件中补充如下代码:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

 

 

 

 

2.1 Server端实现

package cn.example.servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;public class Result extends HttpServlet{public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{System.out.println("++++++++++++++++get the infor");JSONObject json = new JSONObject();json.put("status", 2);json.put("result", "hello welcome");PrintWriter out = response.getWriter();out.write(json.toString());}}

做一个简单的servlet,只要收到请求了,就返回一个字符串“hello welcom”的json给APP

2.2 结果

APP将收到的结果提取出来,传给下一个页面并显示出来即可。

转载于:https://www.cnblogs.com/zhawj159753/p/4248138.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫(二)——Xpath和Selenium的使用

文章目录2 网络爬虫进阶2.1 Xpath2.1.1 Xpath解析原理2.1.2 信息提取2.1.2.1 获取所有结点2.1.2.2 获取子节点2.1.2.3 获取父节点2.1.2.4 获取文本2.1.3 属性匹配2.1.3.1 单个属性匹配2.1.3.2 多个属性匹配3.1 Selenium3.1.1 概述3.1.2 安装3.1.3 元素定位3.1.4 元素信息3.1.5 …

hdu-1176(dp)

解题思路&#xff1a;用dp做的&#xff0c;dp[i][j]表示在i时刻&#xff0c;j点的最大馅饼。a[i][j]表示在i这个时刻j点同时掉落的馅饼&#xff1b; 每个点除了0和10之外&#xff0c;都有三种状态&#xff1b; 1、没有移动&#xff0c;这样值就为dp[i][j]max(dp[i][j],dp[i-1][…

lintcode:买卖股票的最佳时机 III

买卖股票的最佳时机 III 假设你有一个数组&#xff0c;它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。 样例 给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6 解题 尝试参考买卖股票的最佳时机 II 提交运行发现错误&#…

session 学习

Session模型简介Session 是什么呢&#xff1f;简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时&#xff0c;可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台 WWW服务器建立连接时&#xff0c;他就与这个服务器建立了一个Session&#x…

julia学习笔记(二)——基本数据类型

文章目录2 数据类型2.1 整数2.2 浮点数2.3 机器精度2.4 舍入模式2.5 数值字面量系数2.6 零和一的字面量2 数据类型 2.1 整数 如果想要在julia中输入整数字面值。如下&#xff1a; julia> 34 7至于你的整数字面值默认是什么数据类型&#xff0c;这取决于目标系统是32位还是…

微信(支付宝)小程序蓝牙4.0线上项目

需求 &#xff1a; 微信(支付宝)小程序链接BLE4.0 &#xff0c;发送指令到蓝牙硬件过程 &#xff1a; 小程序分为安卓和ios两套系统&#xff0c;支持连接BLE 蓝牙 &#xff0c;其中会遇到机型问题&#xff08;其中安卓&#xff0c;华为荣耀机型&#xff0c;小米&#xff0c;问题…

团队项目计划BACKLOG

团队名称&#xff1a; 铁大老司机 团队成员&#xff1a; 组长&#xff1a;杨超群 组员&#xff1a;杨涛 杜文星 张家军 计划会议过程&#xff1a; 我们小组在周三下午进行了团队会议&#xff0c;会议召开在图书馆大厅&#xff0c;主要内容是进行项目的总体计划安排&#xff0…

pyc文件

学习自&#xff1a;http://blog.csdn.net/sislcb/article/details/4002414 Python解释器:源代码-->字节码-->机器语言不同版本编译后的pyc文件是不同的python提供了内置库文件来实现将python编译成pyc文件。 import py_compile py_compile.compile(rH:/game/test.py) pyc…

C++从0到1的入门级教学(八)——通讯录管理系统

文章目录8 通讯录管理系统8.1 系统需求8.2 菜单功能8.3 退出功能8.4 添加联系人8.4.1 设计联系人结构体8.4.2 设计通讯录结构体8.4.3 main函数中创建通讯录8.4.4 封装添加联系人函数8.5 显示联系人8.5.1 封装显示联系人函数8.5.2 调用显示联系人函数8.6 删除联系人8.6.1 封装检…

【Data Cluster】真机环境下MySQL数据库集群搭建

真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同&#xff0c;它采用 无共享架构Shared nothing&#xff08;shared nothing architecture&#xff09;。整个集群由管理节点(ndb_mgmd)&#xff0c;处理节点(mysqld)和存储节点(ndbd)组…

【层次聚类】python scipy实现

层次聚类 原理 有一个讲得很清楚的博客&#xff1a;博客地址 主要用于&#xff1a;没有groundtruth&#xff0c;且不知道要分几类的情况 用scipy模块实现聚类 参考函数说明&#xff1a;pdistsquareformlinkagefcluster scipy.spatial.distance.pdist&#xff1a;计算点之间的距…

Find a girl friend

Find a girl friend Time Limit: 1000ms Memory limit: 262144K 有疑问&#xff1f;点这里^_^ 题目描述 CC wants to find a girl friend, he knows each girls age and name in his class, and each girl’s age is different.. Now he wants to know the youngest girls n…

数据结构杂谈(八)——树(上)

文章目录8 树(上)8.1 引入8.2 树的基础知识8.3 树的存储结构8.3.1 双亲表示法8.3.2 孩子表示法8.4 二叉树8.4.1 基础知识8.4.2 高频考点8.4.3 二叉树的性质8.4.4 二叉链表8.4.5 树和二叉树的转换8.4.6 森林和二叉树的转换8.5 遍历8 树(上) 8.1 引入 我们在前面的章节中一直在…

vs entityframwork Validation failed for one or more entities

问题&#xff1a;添加数据库一条数据时出错 查找异常 catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("P…

Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide开源组件加载网络图片的优缺点比较...

在android中的加载网络图片是一件十分令人头疼的事情&#xff0c;在网上有着许多关于加载网络图片的开源库&#xff0c;可以让我们十分方便的加载网络图片。在这里我主要介绍一下我自己在使用Volley, Picasso, Universal-Imageloader的一些使用的感悟。以及最基本的用法介绍。1…

hdu 1754 I Hate It(分块做法)

题意&#xff1a;中文题&#xff0c;不多解释 思路&#xff1a;这个题原本用线段树很容易做&#xff0c;但分块其实也很容易&#xff0c;对于分块的复杂度还不是很会计算&#xff0c;只知道是每次分为sqrt&#xff08;n&#xff09;块&#xff0c;然后一共有sqrt&#xff08;n&…

Maven(一)——快速上手Maven

文章目录Maven概述Maven简介Maven的安装Maven的基本使用IDEA配置Maven依赖管理依赖范围Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; &#xff08;一&#xff09;提供了一套标准化的项目结构 不同的IDE项目结构是不一样的&…

如何定制Activity的标题栏

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); //自定义标题栏 mWindow getWindow(); mWindow.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar); titlebar.xml <?xml version"1.…

牛客网 牛客小白月赛1 H.写真がとどいています

H.写真がとどいています链接&#xff1a;https://www.nowcoder.com/acm/contest/85/H来源&#xff1a;牛客网这个题数乱了&#xff0c;导致wa了好几次。特别弱智&#xff0c;从A开始往上&#xff0c;就是A,B,C,D,E,F。A的下面就是G开始倒着&#xff0c;G,F,E。我智障&#xff0…

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作&#xff0c;为Student实体的 web 页。在本教程中&#xff0c;您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面&#xff0c;并简单分组。 下面的插图显示页面当你完成时的样子。列标题是链接&#xff0c;用户可…