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>() {

            @Override
            protected 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() {

                    @Override
                    public 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() {

                    @Override
                    public 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;

    @Override
    protected 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() {

            @Override
            public 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() {

                            @Override
                            public void onSuccess(String result) {

                                Intent intent = new Intent(MainActivity.this, ATYHome.class);
                                intent.putExtra(Config.KEY_RESULT, result);
                                startActivity(intent);

                                finish();

                            }
                        },
                        new Login.FailCallback() {

                            @Override
                            public 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将收到的结果提取出来,传给下一个页面并显示出来即可。

时间: 2024-08-27 20:17:27

Android 网络通信架构学习的相关文章

Android输入法架构学习总结

此文为本人学习输入法之后所做的一个总结报告.与大家分享. 安卓输入法框架(Input Method Framework)IMF 一.输入法框架简介 自Android平台1.5版本以后,Google开放了 Android平台输入法框架(InputMethod Framework, IMF) , IMF是Android平台的特色设计.它的出现大大推动了不带实体键盘的设备的诞生.同时,Android平台输入法框架也给出了输入法的开发所需要的接口,为Android平台的输入法提供了可扩展性. 二.输入法

Android的学习之路一 android的架构

一 Android的架构 二 本地库 来自开源社区的C/C++本地库为Android应用层提供了必需的服务.它们包括: Webkit 一个高速的WEB渲染引擎,这个引擎已经被Safari.Chrome和很多其他的浏览器所使用. SQLite 一个全功能的SQL数据库 Apache Harmony 开源的JAVA实现 OpenGL 3D图像渲染库 OpenSSL 安全套接字层 三 Dalvk 虚拟机 了解Dalvk就需要从JAVA的角度出发,同时明白他们之间的区别,推荐以下文章 java虚拟机和D

(1)-Android学习笔记之:初识Android系统架构和项目结构

Android系统架构 Android程序结构 创建一个Android项目,为初学便于理解,将程序项目结构切换为Project模式,项目结构如下 .gradle和.idea:这两个目录下放的都是Android Studio自动生成的文件,无需我们关心,也不需要手动编辑. app:项目中的代码.资源等内容几乎都放在这个目录下,开发工作基本在这个目录下进行. libs:如果项目引用了第三方jar包,就需要吧这些jar包放在libs目录下,此目录下的jar包都会自动添加到构建目录中. androidT

Android APP架构心得

前言 从JavaEE转到Android开发也2年多了,开发的项目也有4,5个了(公司项目),其中有3个项目前期都是自己独立开发,从一开始的毫无架构到现在对如何架构也有一点心得,所以在此分享出来,大家一起交流 什么是架构 在我看来,软件架构绝对不只是框架的堆砌,看我看来,架构是为了方便软件维护.扩展.安全性.切入性(我也不知道有没有人提出过这个关键字,因为的确很少看见,简单来说我这里说的切入性就是指一个以前没有接触过这个项目的人,能快速加入到这个项目中,对项目进行维护.修改和扩展) 维护性 一个好

Android开发最佳学习路线图

      为了帮助大家更好的学习Android开发的相关知识,尚观4G智能操作系统研究室(www.up4g.com)为大家制作下面学习路线图:希望能帮助到广大的android爱好者. 在開始之前我们先来对相关知识进行一个简单的了解:   行业背景: 今天,涉及通信产业链中的每一个环节,都有Android的身影,Android是第一款全然完整打通了整个通信产业链中的操作系统,手机方案商.集成商.运营商.内容提供商.用户,都在玩Android,都吃惊于Android的爆发式增长速度,Android

Android技术19:Android系统架构

Android系统架构是学习Android最基本的知识点,经常在技术面试过程中涉及到有关问题,接下来对Android系统架构进行总结. Android官方文档提供资料显示:Android系统分为4个层次,从低到高依次为Linux kernel(Linux内核层),Libraries和Android运行时Runtime,Android Framework,Applications. 1.Applications应用层 该层主要是运行在Andorid系统上的应用程序,如Home,SMS,Contac

Android源码学习初步

目前,互联网行业正在朝着移动互联网方向强劲地发展,而移动互联网的发展离不开背后的移动平台的支撑.众所周知,如今在移动平台市场上,苹果的iOS.谷歌的Android和微软的Windows Phone系统已经形成了三足鼎立的形势,而Android系统的市场占有率是最高的.Android系统之所以能够在市场上占据着第一的位置,一来是因为它依托着谷歌的品德效应和技术实力,二来是因为它是开放的,任何人都可以得到它的源代码,并且能够自由地使用它.既然Android系统是开放的,作为一个移动平台开发人员来说,

【Android系统】Android系统架构简介

概述 Android系统架构如下图: 从上往下一共是四层: 应用程序层.应用程序框架层.函数库与Android运行时层.Linux内核层. 下面分别介绍各层: 分层介绍 应用程序层 包含系列的Android核心应用程序,大部分的Android应用也属于这一层,如日历.闹钟.浏览器等.这一层属于用户. 应用程序框架层 这一层就是普通开发者需掌握的层,我们使用框架里的各个模块来开发应用,这些模块和各种服务都可以复用.理解了这一层,开发者就能更快更好的开发应用.下面介绍一下各个模块: 序号 模块名 用

【转】Android 网络通信框架Volley简介(Google IO 2013)

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Go