在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到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)。

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </LinearLayout>

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

 /**
* 常量接口
* @author 刘伟 2015.7.3
*
*/
public interface Constants {
/* 请求方式 */
String POST = "post";
String GET = "get"; /* 加载对话框指令码 */
int DIALOG_SHOW = 1;
int DIALOG_CONCEL = 0; /* 请求标识码--在响应结果用于区分不用响应 */
int REQUEST_360LAUGH_CODE = 0000; /* 请求地址 */
String LAUGH_URL_360 = "http://xiaohua.hao.360.cn/m/itxt";
}

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

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

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

 /**
* 基类
* @author 刘伟 2015.7.3
*
*/
public class BaseActivity extends FinalActivity implements Constants {
private Dialog dialog;
protected Handler mHandler = new Handler(){ public void handleMessage(Message msg) {
if(msg.what == DIALOG_SHOW){
dialog.show();
} else {
dialog.cancel();
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建并初始化加载对话框
dialog = new Dialog(this, R.style.dialogTheme);
dialog.setContentView(R.layout.loaddialog);
dialog.setCanceledOnTouchOutside(true);
}
}

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

 package com.laughdemo.http;
import java.util.Map;
import net.tsz.afinal.FinalHttp;
import net.tsz.afinal.http.AjaxCallBack;
import net.tsz.afinal.http.AjaxParams;
import com.laughdemo.utils.Constants;
/**
* 网络请求工具类
* @author 刘伟 2015.7.3
*
*/
public class HttpRequest implements Constants {
private final String TAG = "HttpRequest";
private FinalHttp fh;
private DataCallBack dataCallBack; public HttpRequest(DataCallBack dataCallBack){
fh = new FinalHttp();
this.dataCallBack = dataCallBack;
} public void requestPost(int requestCode, Map<String, String> map, String url){
requestData(requestCode, map, url, POST);
} public void requestGet(int requestCode, Map<String, String> map, String url){
requestData(requestCode, map, url, GET);
} //封装网络请求方法
private void requestData(int requestCode, Map<String, String> map, String url, String requestMothed){
String httpUrl = url; if("get".equals(requestMothed)){
//get请求
String urlParam = "";
if (!url.contains("?"))
httpUrl += "?";
else
httpUrl += "&";
int i = map.size();
for(String key: map.keySet()){
i--;
urlParam += key + "=" + map.get(key);
if(i > 0){
urlParam += "&";
}
}
httpUrl += urlParam;
System.out.println(TAG + ":get:" + httpUrl);
fh.get(httpUrl, new HttpListener(requestCode, dataCallBack));
} else {
//post请求
System.out.println(TAG + ":post-httpUrl:" + httpUrl);
System.out.println(TAG + ":post-httpUrl-map:" + map);
AjaxParams ap = new AjaxParams(map);
fh.post(httpUrl, ap, new HttpListener(requestCode, dataCallBack));
} } /**
* Afinal回调
* @author lw
*
*/
class HttpListener extends AjaxCallBack<String>{ private int notify;
private DataCallBack dataCallBack; public HttpListener(int notify, DataCallBack dataCallBack){
this.notify = notify;
this.dataCallBack = dataCallBack;
} @Override
public void onSuccess(String t) {
// TODO Auto-generated method stub
System.out.println(TAG + ":" + t);
if(this.dataCallBack != null){
/** 执行onCallBackSuccessed()回调方法 */
this.dataCallBack.onCallBackSuccessed(notify, t);
}
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
// TODO Auto-generated method stub
if(this.dataCallBack != null){
/** 执行onCallBackFailed()回调方法 */
this.dataCallBack.onCallBackFailed(notify);
}
}
}
}

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

 package com.laughdemo.http;
import java.util.HashMap;
import java.util.Map;
import com.laughdemo.utils.Constants;
/**
* 获取网络数据类
* @author 刘伟 2015.7.3
*
*/
public class GetNetData implements Constants { private HttpRequest httpRequest; public GetNetData(DataCallBack dataCallBack){
this.httpRequest = new HttpRequest(dataCallBack);
} //360笑话接口请求方法
public void getLaughBy360(int requestCode, String pageNo){
Map<String, String> map = new HashMap<String, String>();
map.put("page", pageNo);
httpRequest.requestPost(requestCode, map, LAUGH_URL_360);
} //其他接口请求方法...
}

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

 package com.laughdemo.main;
import net.tsz.afinal.annotation.view.ViewInject;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.laughdemo.http.DataCallBack;
import com.laughdemo.http.GetNetData;
import com.laughdemo.utils.Constants;
/**
* 主窗体类
* @author 刘伟 2015.7.3
*
*/
public class MainActivity extends BaseActivity implements Constants, DataCallBack{
final String TAG = "MainActivity";
GetNetData getNetData;
@ViewInject(id=R.id.tv_show) TextView tvShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getNetData = new GetNetData(this);
getNetData.getLaughBy360(REQUEST_360LAUGH_CODE, "1");
mHandler.sendEmptyMessage(DIALOG_SHOW);
}
@Override
public void onCallBackSuccessed(int notify, String result) {
mHandler.sendEmptyMessage(DIALOG_CONCEL);
if(notify == REQUEST_360LAUGH_CODE){
tvShow.setText(result);
}
}
@Override
public void onCallBackFailed(int notify) {
Toast.makeText(getApplicationContext(), "网络连接失败", Toast.LENGTH_LONG).show();
}
}

OK,果断上图看效果

      

由图分析:

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

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

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

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

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

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

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

  1. iOS开发--Swift 基于AFNetworking 3.0的网络请求封装

    Swift和OC基于AFNetworking的网络请求流程相同, 就是语法不同, 对于Swift语法不是很清楚的同学, 建议多看看API文档, 自己多多尝试. 写过OC的应该都明白每句话做什么的, 就 ...

  2. Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表

    前面几篇博文介绍了从项目搭建到获取网络字符串,对一个项目的前期整体工作进行了详细的介绍,本篇接着上篇介绍一下怎么样优雅将网络返回的json字符串轻松转换成listview列表. 先上图,看一下效果. ...

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

    本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...

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

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

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

    原文网址:http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html 今天给大家带来<android应用开发全程实录> ...

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

    http://blog.csdn.net/notice520/article/details/7040962 今天给大家带来<android应用开发全程实录>中关于listview和ada ...

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

    今天给大家带来<android应用开发全程实录>中关于listview和adatper中的部分.包括listview的基本使用,listview的优化等. 我们经常会在应用程序中使用列表的 ...

  8. Android ROM开发(三)——精简官方ROM并且内置ROOT权限,开启Romer之路

    Android ROM开发(三)--精简官方ROM并且内置ROOT权限,开启Romer之路 相信ROM的相关信息大家通过前几篇的学习都是有所了解了,这里就不在一一提示了,这里我们下载一个官方包,我们还 ...

  9. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

随机推荐

  1. 01_反射_04_反射类的main方法

    [User.java] package com.Higgin.reflect; public class User { public User(){ System.out.println(" ...

  2. Windows下ANSI、Unicode、UTF8字符编码转换

    主意:输入字符串必须是以'\0'结尾,如果输入字符串没有以'\0'结尾,请手动设置,否则转换会有错误. unsigned int EncodeUtil::AnsiToUcs2( char* pAnsi ...

  3. foreach的一点理解

    首先什么样的数据才能实现foreach 1 实现IEnumerable这个接口 2 有GetEnumerable()这个方法 然后为啥实现这个接口或者有这个方法就可以实现foreach遍历 首先我先用 ...

  4. 【转】Java编程之字符集问题研究

    发现这是对字集说得最明了的一篇文章了. 转发自:http://tomcat-oracle.iteye.com/blog/2037160 1. 概述 本文主要包括以下几个方面:编码基本知识,java,系 ...

  5. Android学习5—布局简介

    Android界面的布局主要有四种,分别为RelativeLayout.LinearLayout.TableLayout.FrameLayout,接下来分别介绍这些布局如何使用(为了简单起见,接下来的 ...

  6. jquery tab mouseover 特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. javaScript中with的用法

    1 JavaScript中的with语句的作用是为逐级的对象访问提供命名空间式的速写方式, 也就是在指定的代码区域, 直接通过节点名称调用对象 初次接触到with用法,是这样一段代码: 1 2 3 4 ...

  8. b+树 b-树的区别

    B+树与B*树小结 一.B+树 1.B+树定义与特性 B+树是B-树的变体,也是一种多路搜索树: 其定义基本与B-树同,除了: 1).非叶子结点的子树指针与关键字个数相同: 2).非叶子结点的子树指针 ...

  9. 怎么利用ultraISO对一个文件夹制作ISO镜像

    1. 运行UltraISO软件,选择好需要转换成ISO的文件,直接拖到UltraISO的界面中. 2.点击“另存为”按钮,选择存放路径并写上ISO文件的名称,文件保存类型选择为ISO格式,点击“保存” ...

  10. Windows Server以服务方式部署Tomcat

    部署免安装版Tomcat7,步骤如下: 解压Tomcat7到指定目录之后,通过命令行定位到 apache-tomcat-7.0.53\bin 目录下面,然后输入 service.bat install ...