首页 > 代码库 > Android 网络通信架构学习

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

Android 网络通信架构学习