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 …

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

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

团队项目计划BACKLOG

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

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)组…

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

文章目录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 引入 我们在前面的章节中一直在…

Maven(一)——快速上手Maven

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

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

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

fluentd主从配置

fluentd是一个免费的、完全开源的日志管理工具&#xff0c;可以对日志进行收集、处理、存储。对于一些高流量的网站或者特殊的架构&#xff0c;需要fluentd高可用配置。 以下是在测试环境搭建模拟fluentd主从配置&#xff0c;模拟主从切换。 服务器 服务 192.168.199.1 elas…

Hadoop总结

目录 大数据概述 Hadoop大数据开发平台 资源管理YARN 分布式文件系统HDFS 非关系型数据库NOSQL 分布式数据库HBASE 批处理和MapReduce 数据仓库查询分析和Hive 基于内存计算的Spark 流计算和Flink 图计算和PREGEL Hadoop常用命令总结 大数据概述 大数据的4V&#x…

HDFS的常用操作

1、HDFS文件的权限以及读写操作 HDFS文件的权限&#xff1a; •与Linux文件权限类似 •r: read; w:write; x:execute&#xff0c;权限x对于文件忽略&#xff0c;对于文件夹表示是否允许访问其内容 •如果Linux系统用户zhangsan使用hadoop命令创建一个文件&#xff0c;那么这个文…

并行计算总结

作者&#xff1a;ArimaMisaki 目录 1 并行计算概述. 2 1.1 基本概念. 2 1.2 存储器的层次结构. 3 1.3 并行计算. 3 1.4 动态互连网络. 4 1.5 并行计算机结构模型. 5 1.6 并行算法的基本设计策略. 6 1.7 并行编程风范. 6 1.8 单核多线程和并发执行. 7 1.9 拓展&#x…

基础总结篇之中的一个:Activity生命周期

子曰&#xff1a;溫故而知新&#xff0c;能够為師矣。《論語》 学习技术也一样&#xff0c;对于技术文档或者经典的技术书籍来说&#xff0c;指望看一遍就全然掌握&#xff0c;那基本不大可能&#xff0c;所以我们须要常常回过头再细致研读几遍&#xff0c;以领悟到作者的思想精…

数据结构杂谈(九)——二叉树的遍历

9 二叉树的遍历 文章目录9 二叉树的遍历9.1 递归函数基础9.2 深度优先遍历的实现9.3 二叉树层次遍历9.1 递归函数基础 什么是递归&#xff1f;调用自身就是叫递归&#xff0c;如下所示&#xff1a; void r(){r(); }我们习惯借用阶梯图来帮助我们理解这些知识。如果是同一层函数…

洛谷 P3750 [六省联考2017]分手是祝愿

传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<queue> #include<cmath> const int N100000,mod100003; #define For(i,a,b)…

解决 error: command 'swig' failed with exit status 1

2019独角兽企业重金招聘Python工程师标准>>> # pip install docker-registry 分析&#xff1a;观察出现的错误&#xff0c;发现最开始报错的地方提示不能找到openssl的.h头文件。一般.h头文件都是放到/usr/inclue目录下的&#xff0c;而且头文件所在的安装包一般叫…

Android安全-SO动态库注入

2019独角兽企业重金招聘Python工程师标准>>> 关于这方面技术&#xff0c;网上已经有大把的实现。在此&#xff0c;我只是记录下自己的学习过程。 0x1 原理 所谓的SO注入就是将代码拷贝到目标进程中&#xff0c;并结合函数重定向等其他技术&#xff0c;最终达到监控或…

BUG日志-2022.7.12——关于VSCode感叹号无法生成HTML骨架问题

解决办法&#xff1a;放弃使用多年的!&#xff0c;而采用html:5的形式。 原因&#xff1a;好像是因为VScode已经更新了 好多扩展也失效了。

hadoop 入门实例【转】

原文链接&#xff1a;http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 1、数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据…

AWS安装CDH5.3-CentOS6.4中关键操作步骤

1、在AWS masternode 上下载cloudera-manager-installer.bin安装包 [rootip-172-21-42-114 ~]# wget http://archive.cloudera.com/cm5/installer/latest/coludera-manager-installer.bin 此时会提示&#xff1a;-bash: wget: command not find 所以要现安装wget命令 [rootip-1…