Android 轻松实现网络交互模板

1.Android与后台交互的模板化方法

2.JSON的使用

3.检查网络连接

4.AsyncTask的使用

我们简单的以登录为例,来实现整个的流程。话不多说,先来看看效果图:

一、通用类的编写

首先,既然要实现交互模板化,最重要的就是要提取出尽可能多的可复用代码。无论是与后台进行什么操作,判断网络是否正常连接、发送请求后得到数据、网络异常时的错误信息提示都是必不可少的。所以我们编写一个通用的CallService类:

[java] view
plain
copy

  1. /** 
  2.  * Created by Hyman on 2015/6/11. 
  3.  */  
  4. public class CallService {  
  5.   
  6.     /** 
  7.      * check net connection before call 
  8.      * 
  9.      * @param context 
  10.      * @return 
  11.      */  
  12.     private static boolean checkNet(Context context) {  
  13.         ConnectivityManager connectivity = (ConnectivityManager) context  
  14.                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
  15.         if (connectivity != null) {  
  16.             // 获取网络连接管理的对象  
  17.             NetworkInfo info = connectivity.getActiveNetworkInfo();  
  18.             if (info != null && info.isConnected()) {  
  19.                 // 判断当前网络是否已经连接  
  20.                 if (info.getState() == NetworkInfo.State.CONNECTED) {  
  21.                     return true;  
  22.                 }  
  23.             }  
  24.         }  
  25.         return false;  
  26.     }  
  27.   
  28.     /** 
  29.      * call service by net 
  30.      * 
  31.      * @param urlString url 
  32.      * @param content   a string of json,params 
  33.      * @return the result,a string of json 
  34.      */  
  35.     public static String call(String urlString, String content, Context context) {  
  36.         if (!checkNet(context)) {  
  37.             return null;  
  38.         }  
  39.         try {  
  40.             URL url = new URL(urlString);  
  41.             HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  42.             conn.setConnectTimeout(5000);  
  43.             conn.setDoOutput(true);  
  44.             conn.setRequestMethod("POST");  
  45.             conn.setRequestProperty("User-Agent", "Fiddler");  
  46.             conn.setRequestProperty("Content-Type", "application/json");  
  47.             conn.setRequestProperty("Charset", "utf-8");  
  48.             OutputStream os = conn.getOutputStream();  
  49.             os.write(content.getBytes());  
  50.             os.close();  
  51.             int code = conn.getResponseCode();  
  52.             if (code == 200) {  
  53.                 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));  
  54.                 String retData;  
  55.                 String responseData = "";  
  56.                 while ((retData = in.readLine()) != null) {  
  57.                     responseData += retData;  
  58.                 }  
  59.                 in.close();  
  60.                 return responseData;  
  61.             }  
  62.         } catch (MalformedURLException e) {  
  63.             e.printStackTrace();  
  64.         } catch (UnsupportedEncodingException e) {  
  65.             e.printStackTrace();  
  66.         } catch (ProtocolException e) {  
  67.             e.printStackTrace();  
  68.         } catch (IOException e) {  
  69.             e.printStackTrace();  
  70.         }  
  71.         return null;  
  72.     }  
  73.   
  74.     public static void showNetErr(Context context){  
  75.         new AlertDialog.Builder(context)  
  76.                 .setTitle("网络错误")  
  77.                 .setMessage("网络连接失败,请确认网络连接")  
  78.                 .setPositiveButton("确定", new DialogInterface.OnClickListener() {  
  79.                     @Override  
  80.                     public void onClick(DialogInterface arg0, int arg1) {  
  81.   
  82.                     }  
  83.                 }).show();  
  84.     }  
  85.       
  86. }  

其中,判断网络连接状态是借助Android系统提供的ConnectivityManager的方法实现的,借助这个类我们还可以获取更多的连接状态信息,包括当前是用流量还是WIFI等等。

然后,在调用本类核心方法call()时,传入了三个参数,一个是后台服务的url路径,一个是已经组装好的参数,第三个是上下文context。

在这个方法中,我们先去判断网络连接,未连接就直接返回空。否则就使用HttpURLConnection方法向服务器发送请求,再把服务器的返回值返回给调用者。

另一个showNetErr方法就只是简单地跳出一个对话框进行提示。

二、利用Json以及AsyncTask进行交互

我们都知道,在安卓中进行网络操作等等这些耗时的操作,都不能在主线程(即UI线程中)操作,所以我们利用安卓提供的异步机制AsyncTask(或者也可以自己写new Thread + Handler)来进行网络操作。还不了解AsyncTask用法的朋友可以看我的另一篇博客 Android
AsyncTask详解

我们以登录为例:

[java] view
plain
copy

  1. /** 
  2.  * Created by Hyman on 2015/6/11. 
  3.  */  
  4.   
  5. public class Login {  
  6.   
  7.     private static final String urlString = GetServerUrl.getUrl() + "index.php?r=period/login";  
  8.     private static final String TAG = "Login";  
  9.   
  10.     private ProgressBar progressBar;  
  11.     private Context context;  
  12.   
  13.     private String userName;  
  14.     private String password;  
  15.   
  16.     public Login( Context context,ProgressBar progressBar) {  
  17.         this.progressBar=progressBar;  
  18.         this.context = context;  
  19.     }  
  20.   
  21.     public void login(String userName,String password) {  
  22.         Log.i(TAG, "call login");  
  23.         this.userName=userName;  
  24.         this.password=password;  
  25.         new LoginTask().execute();  
  26.     }  
  27.   
  28.     class LoginTask extends AsyncTask<Void, Void, String> {  
  29.         @Override  
  30.         protected String doInBackground(Void... params) {  
  31.             JSONObject tosendsObject = new JSONObject();  
  32.             Log.i(TAG, "start put json!");  
  33.             try {  
  34.                 //add account info  
  35.                 tosendsObject.put("username", userName);  
  36.                 tosendsObject.put("password", password);  
  37.             } catch (JSONException e) {  
  38.                 e.printStackTrace();  
  39.             }  
  40.             //change json to String  
  41.             String content = String.valueOf(tosendsObject);  
  42.             Log.i(TAG, "send :" + content);  
  43.             String responseData = CallService.call(urlString, content,context);  
  44.             if(responseData==null || responseData.equals("")){  
  45.                 return null;  
  46.             }  
  47.             Log.i(TAG, "res:" + responseData);  
  48.             JSONObject resultObject = null;  
  49.             String result=null;  
  50.             try {  
  51.                 resultObject = new JSONObject(responseData);  
  52.                 result = resultObject.getString("result");  
  53.                 Log.i(TAG, "result:" + result);  
  54.             } catch (JSONException e) {  
  55.                 e.printStackTrace();  
  56.             }  
  57.             return result;  
  58.         }  
  59.   
  60.         @Override  
  61.         protected void onPreExecute() {  
  62.             progressBar.setVisibility(View.VISIBLE);    //show the progressBar  
  63.             super.onPreExecute();  
  64.         }  
  65.   
  66.         @Override  
  67.         protected void onPostExecute(String  result) {  
  68.              progressBar.setVisibility(View.GONE);    //hide the progressBar  
  69.             if(result==null){  
  70.                 CallService.showNetErr(context);  
  71.                 return;  
  72.             }  
  73.             Toast.makeText(context,"result:"+result,Toast.LENGTH_SHORT).show();  
  74.             //here you can do anything you want after login   
  75.         }  
  76.     }  
  77. }  

我们在LoginActivity中初始化这个类的实例,传入上下文以及ProgressBar(用于提高用户体验),再调用login方法传入用户名和密码这两个参数。在进行操作前,onPreExecute方法显示出ProgressBar,在返回结果后,onPostExecute方法再隐藏ProgressBar。

然后我们再看doInBackGroud方法(这个方法听名字就是异步操作啊):我们创建一个JsonObject对象,再使用键值对的方法(类似map)传入参数,最后转成String后一起传给服务器。在得到结果后把服务器返回的json形式的字符串转成JsonObject。如果返回的是空,说明连接有问题,就调用通用类的showNetErr方法。

我把Log截了图,此前不清楚Json格式的朋友可以管中窥豹:

如果有需要传一个list给服务器,还可以使用JsonArray类。比如:

[java] view
plain
copy

  1. JSONArray jsonArray = new JSONArray();  
  2. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  3. try {  
  4.     for (PeriodPO peroid : localPeriods) {      //这是一个我自定义的数据结构的list  
  5.         JSONObject periodObject = new JSONObject();  
  6.         periodObject.put("date", sdf.format(peroid.getDate()));  
  7.         periodObject.put("tag", peroid.getTag());  
  8.         periodObject.put("length", peroid.getLength());  
  9.         jsonArray.put(periodObject);            //把每一个对象转成JsonObject,再把每个object放入Array  
  10.     }  
  11.     tosendsObject.put("periods", jsonArray);  
  12.     //add account info  
  13.     tosendsObject.put("username", "test");  
  14. } catch (JSONException e) {  
  15.     e.printStackTrace();  
  16. }  
时间: 2024-09-17 18:31:01

Android 轻松实现网络交互模板的相关文章

美图秀秀设计分析:在Android,iPhone上的交互设计

文章描述:只是自己对于美图秀秀这款产品在设计上的一些想法,权当抛砖引玉,还请指点. 出于职业习惯,使用一款产品时总会不自觉地对其设计进行分析.当打开美图秀秀时,我知道,我又开始了. 美图秀秀是厦门美图科技有限公司旗下的一款产品,分别有 PC 客户端, Android, iPhone 应用.公司旗下还有其它几款产品:美图看看--免费看图软件,美图拍拍--摄像头自拍软件,美图淘淘--网店图片批理处理软件,美图化妆秀--强大的上妆软件.个人非常看好美图淘淘,依托淘宝这个大平台,它为广大淘宝店家们解决了

Android是否存在网络注入攻击?

本文讲的是Android是否存在网络注入攻击?, Web注入攻击 MiT-browser (MiTB) 如今大多数人都使用网上银行,而黑客正是利用这个机会,通过发动这种网页代码注入攻击,能够修改被感染用户设备浏览器中的银行主页 MiTB攻击就发生在这个时候,攻击者会诱导你下载木马,一旦你访问特定的银行网站的时候,恶意软件就会使用包括注入恶意DLL,恶意扩展或通过欺骗代理服务器或其他方式往你访问的页面注入更复杂的恶意代码,MiTB会把它自己直接集成到网页上,还能保持原有的域名和SSL设置,看起来和

Android热身:通过网络获取资源并更新UI组件

Android热身:通过网络获取资源并更新UI组件 目标 点击"发送请求"按钮,下载某网页的html源码,并显示在TextView控件上:点击"清空",清除TextView控件上的内容 效果图: 要点 开启网络权限 网络请求独立为一个模块 按钮点击事件的监听器 新开线程进行网络请求调用 用handler更新UI组件 源码 //MainActivity.java 主程序 package com.example.chris.handlerdemo; import and

android httpclient处理网络异常

问题描述 android httpclient处理网络异常 如题,如何设置网络超时,或网络异常,并且提示用户异常,哪位大侠,给个详细代码,感激不进 解决方案 转载自: ? ? ? ? ? ??http://android.tgbus.com/Android/tutorial/201108/364645.shtml ? (Android开发实现HttpClient工具类) ? ? ? ? ??http://www.open-open.com/lib/view/open1329101420890.h

轻松搭建网络办公平台:71BASE-OFFICE网络办公系统v1.3

网络|网络办公 搭建网络办公平台1 [ 作者:孙成 转贴自:本站原创 点击数:60 更新时间:2003-12-11 文章录入:tjrao ] 局域网中轻松搭建网络办公平台 网络迅速发展的今天,电子商务.电子政务在企业和机关单位迅速普及,网络办公已经成为现代办公的主流,它不但提高了员工的工作效率,而且减少了办公费用的支出,这种以网络为媒介的办公就是我们常说的"无纸办公",所有的日常工作以及员工间的相互协作都是在网络中完成的,下面我们就使用"71BASE-OFFICE网络办公系统

Android编程判断网络连接是否可用的方法_Android

本文实例讲述了Android编程判断网络连接是否可用的方法.分享给大家供大家参考,具体如下: 为了提高用户体验,我们在开发 android 应用的过程需要联网获取数据的时候我们首先要做的一步就是: 1.判断当前手机是否打开了网络 2.打开了网络是否可以上网 然后再去执行联网逻辑,避免没联网做不必要的工作! 通常情况下,我们是这样判断的 public static boolean isNetAvailable(Context context) { ConnectivityManager conne

Android 轻松实现语音识别

  苹果的iphone 有语音识别用的是Google 的技术,做为Google 力推的Android 自然会将其核心技术往Android 系统里面植入,并结合google 的云端技术将其发扬光大. 所以Google Voice Recognition在Android 的实现就变得极其轻松. 语音识别,借助于云端技术可以识别用户的语音输入,包括语音控制等技术,下面我们将利用Google 提供的Api 实现这一功能. 功能点为:通过用户语音将用户输入的语音识别出来,并打印在列表上. 功能界面如下:

android移动终端网络数据包的解析

问题描述 android移动终端网络数据包的解析 Android移动终端网络数据监控系统的设计与实现:网络数据包的解析,主要包括在移动终端生成网络数据包,然后将网络数据包发送给服务器端进行解析并进行资源文件(图片.文本.视频等)统计,最后将结果返回移动终端并在界面上显示. 请问该怎样实现? 解决方案 http://blog.csdn.net/carterjin/article/details/7571915

请求参数返回数据成功-android开发,网络中可以请求返回数据

问题描述 android开发,网络中可以请求返回数据 android开发,在一个网络中可以请求参数返回数据成功,在另一个网络下请求不成功!这是什么原因啊? 解决方案 首先分析这两个网络环境的差异,原因肯定就在这个差异当中.然后分析是发送不成功还是服务器没有收到还是服务器的返回没有收到还是返回的数据是有问题,找到问题在哪里. 解决方案二: 这个网络的差异就是进不去的网络被禁用了一些端口,只是有些接口不可访问,有些接口可以访问.