Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的

  在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到Afinal框架,不会用Afinal的童鞋可以先看一下上一篇博文),正所谓麻雀虽小,五脏俱全,这在里我会尽量的将前期的项目搭建做的相对实用一些,以便后期可以有效的实现团队协作和项目维护。一开始可能会看起来麻烦些,可能会觉得还不如直接用简单的方式去实现来的方便,磨刀不误砍柴工嘛,要想后期开发效率高一些,前期就不要图省事了。

  一个项目肯定不是一蹴而就的,咱们一步一步来,本篇博文先详细介绍项目搭建、通过url地址发送网络请求获取json数据。

  先来看一下思路:

  1、对Afinal中的get或者post方法进行一下封装,目的主要是不用每次请求时都再去写重复代码,并且如果有人员分工的话,各开发人员就可以公用封装好的方法。

  2、提交url地址(接口)获取json字符串。

  3、将获取到的字符串显示出来。

  在这里我们使用360免费笑话接口:http://xiaohua.hao.360.cn/m/itxt

一、首先创建工程,工程名:LaughDemo(在博文:《Android项目开发全程(一)--创建工程》中有介绍)

  1、布局文件很简单,只有一个TextView用来显示获取的json数据(activity_main.xml)。

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6
 7     <TextView
 8         android:id="@+id/tv_show"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content" />
11
12 </LinearLayout>

  2、创建一个常量接口(Constant.java)

 1 /**
 2  * 常量接口
 3  * @author 刘伟    2015.7.3
 4  *
 5  */
 6 public interface Constants {
 7     /* 请求方式  */
 8     String POST = "post";
 9     String GET = "get";
10
11     /* 加载对话框指令码 */
12     int DIALOG_SHOW = 1;
13     int DIALOG_CONCEL = 0;
14
15     /* 请求标识码--在响应结果用于区分不用响应  */
16     int REQUEST_360LAUGH_CODE = 0000;
17
18     /* 请求地址  */
19     String LAUGH_URL_360 = "http://xiaohua.hao.360.cn/m/itxt";
20 }

  3、创建一个回调接口,让需要做网络请求的Activity实现此接口(DataCallBack.java)

1 /**
2  * 回调接口
3  * @author 刘伟    2015.7.3
4  *
5  */
6 public interface DataCallBack {
7     public void onCallBackSuccessed(int notify, String result);//请求响应成功时回调
8     public void onCallBackFailed(int notify);//请求响应失败时回调
9 }

  4、创建一个基类(BaseActivity.java),将一些共同的工作放在里面,这里的基类初始化了一个加载对话框(对话框代码布局代码比较简单,就不贴了)。

 1 /**
 2  * 基类
 3  * @author 刘伟    2015.7.3
 4  *
 5  */
 6 public class BaseActivity extends FinalActivity implements Constants {
 7     private Dialog dialog;
 8     protected Handler mHandler = new Handler(){
 9
10         public void handleMessage(Message msg) {
11             if(msg.what == DIALOG_SHOW){
12                 dialog.show();
13             } else {
14                 dialog.cancel();
15             }
16         };
17     };
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         //创建并初始化加载对话框
22         dialog = new Dialog(this, R.style.dialogTheme);
23         dialog.setContentView(R.layout.loaddialog);
24         dialog.setCanceledOnTouchOutside(true);
25     }
26 }

  5、创建一个网络请求工具类(HttpRequest.java),将网络请求方法进行封装。

 1 package com.laughdemo.http;
 2 import java.util.Map;
 3 import net.tsz.afinal.FinalHttp;
 4 import net.tsz.afinal.http.AjaxCallBack;
 5 import net.tsz.afinal.http.AjaxParams;
 6 import com.laughdemo.utils.Constants;
 7 /**
 8  * 网络请求工具类
 9  * @author 刘伟    2015.7.3
10  *
11  */
12 public class HttpRequest implements Constants {
13     private final String TAG = "HttpRequest";
14     private FinalHttp fh;
15     private DataCallBack dataCallBack;
16
17     public HttpRequest(DataCallBack dataCallBack){
18         fh = new FinalHttp();
19         this.dataCallBack = dataCallBack;
20     }
21
22     public void requestPost(int requestCode, Map<String, String> map, String url){
23         requestData(requestCode, map, url, POST);
24     }
25
26     public void requestGet(int requestCode, Map<String, String> map, String url){
27         requestData(requestCode, map, url, GET);
28     }
29
30     //封装网络请求方法
31     private void requestData(int requestCode, Map<String, String> map, String url, String requestMothed){
32         String httpUrl = url;
33
34         if("get".equals(requestMothed)){
35             //get请求
36             String urlParam = "";
37             if (!url.contains("?"))
38                 httpUrl += "?";
39             else
40                 httpUrl += "&";
41             int i = map.size();
42             for(String key: map.keySet()){
43                 i--;
44                 urlParam += key + "=" + map.get(key);
45                 if(i > 0){
46                     urlParam += "&";
47                 }
48             }
49             httpUrl += urlParam;
50             System.out.println(TAG + ":get:" + httpUrl);
51             fh.get(httpUrl, new HttpListener(requestCode, dataCallBack));
52         } else {
53             //post请求
54             System.out.println(TAG + ":post-httpUrl:" + httpUrl);
55             System.out.println(TAG + ":post-httpUrl-map:" + map);
56             AjaxParams ap = new AjaxParams(map);
57             fh.post(httpUrl, ap, new HttpListener(requestCode, dataCallBack));
58         }
59
60     }
61
62     /**
63      * Afinal回调
64      * @author lw
65      *
66      */
67     class HttpListener extends AjaxCallBack<String>{
68
69         private int notify;
70         private DataCallBack dataCallBack;
71
72         public HttpListener(int notify, DataCallBack dataCallBack){
73             this.notify = notify;
74             this.dataCallBack = dataCallBack;
75         }
76
77         @Override
78         public void onSuccess(String t) {
79             // TODO Auto-generated method stub
80             System.out.println(TAG + ":" + t);
81             if(this.dataCallBack != null){
82                 /** 执行onCallBackSuccessed()回调方法 */
83                 this.dataCallBack.onCallBackSuccessed(notify, t);
84             }
85         }
86         @Override
87         public void onFailure(Throwable t, int errorNo, String strMsg) {
88             // TODO Auto-generated method stub
89             if(this.dataCallBack != null){
90                 /** 执行onCallBackFailed()回调方法 */
91                 this.dataCallBack.onCallBackFailed(notify);
92             }
93         }
94     }
95 }

  6、创建一个提交网络地址类(GetNetData.java),将不同的地址提交方法放在此类下。

 1 package com.laughdemo.http;
 2 import java.util.HashMap;
 3 import java.util.Map;
 4 import com.laughdemo.utils.Constants;
 5 /**
 6  * 获取网络数据类
 7  * @author 刘伟    2015.7.3
 8  *
 9  */
10 public class GetNetData implements Constants {
11
12     private HttpRequest httpRequest;
13
14     public GetNetData(DataCallBack dataCallBack){
15         this.httpRequest = new HttpRequest(dataCallBack);
16     }
17
18     //360笑话接口请求方法
19     public void getLaughBy360(int requestCode, String pageNo){
20         Map<String, String> map = new HashMap<String, String>();
21         map.put("page", pageNo);
22         httpRequest.requestPost(requestCode, map, LAUGH_URL_360);
23     }
24
25     //其他接口请求方法...
26 }

  7、最后一个类了,主窗体类(MainActivity.java),与用户交互,调用GetNetData.java中的getLaughBy方法获取json字符串,然后在tvShow展示。

 1 package com.laughdemo.main;
 2 import net.tsz.afinal.annotation.view.ViewInject;
 3 import android.os.Bundle;
 4 import android.widget.TextView;
 5 import android.widget.Toast;
 6 import com.laughdemo.http.DataCallBack;
 7 import com.laughdemo.http.GetNetData;
 8 import com.laughdemo.utils.Constants;
 9 /**
10  * 主窗体类
11  * @author 刘伟    2015.7.3
12  *
13  */
14 public class MainActivity extends BaseActivity implements Constants, DataCallBack{
15     final String TAG = "MainActivity";
16     GetNetData getNetData;
17     @ViewInject(id=R.id.tv_show) TextView tvShow;
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22         getNetData = new GetNetData(this);
23         getNetData.getLaughBy360(REQUEST_360LAUGH_CODE, "1");
24         mHandler.sendEmptyMessage(DIALOG_SHOW);
25     }
26     @Override
27     public void onCallBackSuccessed(int notify, String result) {
28         mHandler.sendEmptyMessage(DIALOG_CONCEL);
29         if(notify == REQUEST_360LAUGH_CODE){
30             tvShow.setText(result);
31         }
32     }
33     @Override
34     public void onCallBackFailed(int notify) {
35         Toast.makeText(getApplicationContext(), "网络连接失败", Toast.LENGTH_LONG).show();
36     }
37 }

OK,果断上图看效果

      

由图分析:

1、程序启动后会调用getLaughBy360()方法做网络请求。

2、同时会通过mHandler.sendEmptyMessage()发送消息显示加载对话框。

3、请求成功后回调onCallBackSuccessed(),获取json字符串并隐藏加载对话框。

4、最后一步匹配请求码,并显示json字符串。

现在获取到的json字符看起来像是一顿乱码,这正是我们想要的,我们后续要做的工作就是解析这些“乱码”,然后让它们有规则的显示到listview中,等整个项目完成后本人会把代码上传并附上下载链接(现在还没完成暂不能上传),今天先更新到这里,后续博文将会详细介绍解析全程。

注:转载时请附上本文链接。

时间: 2024-10-14 03:52:40

Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的的相关文章

Android项目开发全程(二)--Afinal用法简单介绍

本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目中用到的几个功能: Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题. Af

android应用开发全程实录-你有多熟悉listview

http://blog.csdn.net/notice520/article/details/7040962 今天给大家带来<android应用开发全程实录>中关于listview和adatper中的部分.包括listview的基本使用,listview的优化等. 我们经常会在应用程序中使用列表的形式来展现一些内容,所以学好ListView是非常必需的.ListView也是Android中比较难以使用的控件,这节内容就将详细解读ListView的用法. 一个ListView通常有两个职责. (

【转】android应用开发全程实录-你有多熟悉listview?---不错

原文网址:http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html 今天给大家带来<android应用开发全程实录>中关于listview和adatper中的部分.包括listview的基本使用,listview的优化等. 我们经常会在应用程序中使用列表的形式来展现一些内容,所以学好ListView是非常必需的.ListView也是Android中比较难以使用的控件,这节内容就将详细解读ListView的用法. 一个Lis

ios项目开发(天气预报项目):使用正则获取 weather.com.cn网站信息

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片 <pre code_snippet_id="346208" snippet_file_name="blog_20140515_1_2220869" name="code" class="cpp">- (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {

ios项目开发(天气预报项目):通过经纬度获取当前城市名称

 1 . 在项目里添加 CoreLocation.framework 2 .在 .h 文件输入如下: 1.#import <CoreLocation/CLLocation.h> 2.#import <CoreLocation/CLLocationManager.h> 3.#import <coreLocation/CLGeocoder.h> 4.#import <coreLocation/CLPlacemark.h> 3 . 在 .m文件输入如下: 1.

ios项目开发(天气预报项目):

本项目基于 <使用storyboards建立 Navigation Controller and Table View> http://uliweb.cpython.org/tutorial/view_chapter/424 创建, 代码中使用了 静态的 tableviewcell 增加了 textview,url,json数据解析 部分代码片段: // // cityViewController.h // weather1 // // Created by HeJiasheng on 13-

ios项目开发(天气预报项目):hmacsha1 例子

- (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret { NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding]; NSData *clearTextData = [text dataUsingEncoding:NSUTF8StringEncoding]; unsigned char result[20]; CCHmac(kCCHmacAlgS

RN实战项目网络请求封装(二)

RN实战项目网络请求封装(二) 网络相关学习文档,参考 RN中文网文档 RN中主要是用fetch来完成异步网络请求的,传统的ajax慢慢的会被fetch替代 RN中文网fetch API 案例 fetch('https://mywebsite.com/endpoint/', { method: 'POST', //请求方法 默认get headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', //数据

Android快乐贪吃蛇游戏实战项目开发教程-01项目概述

一.项目简介贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏.我已经将做好的案例上传到了应用宝,大家可以下载下来把玩一下.为了和其它的贪吃蛇区别开来,我取名叫“快乐贪吃蛇”.应用宝链接:http://sj.qq.com/myapp/detail.htm?apkName=net.chengyujia.happysnake这里上两张截图先睹为快,哈哈.怎么玩大家应该都知道,不过我还是要多提一下.通过屏幕上的方向键控制蛇的前进方向.蛇每吃到一个食物身体会