了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
AsyncTask定义了三种泛型类型
,Params 启动任务执行的输入参数,(即doInBackGround方法所接受的参数)比如HTTP请求的URL。
Progress 后台任务执行的百分比。(即onProgressUpdate(参数)函数接受的参数类型,该方法由doInBackGround方法里的publishProgress(i)促发的,一般该参数为void()。Result 后台执行任务最终返回的结果,(即doInBackGround的返回值类型以及onPostExecute(参数)函数的参数类型。
在使用AsyncTask时需要注意:AsyncTask的doInBackGround(integer….parm)第一个参数是由调用方的new ProAsyncTask().execute(100,200)来传递进去的,而且是一个变长的参数,在doInBackground方法中接受时可以用parm[0]接受100,parm[1]接受200。
使用AsyncTask类,以下是几条必须遵守的准则:
(1)Task的实例必须在UI thread中创建
(2)execute方法必须在UI thread中调用
(3)该task只能被执行一次,否则多次调用时将会出现异常
参考代码:
// 负责异步加载数据
class KnowledgeTask extends AsyncTask> {
@Override
protected ArrayList doInBackground(Integer... params) {
int from = params[0];
try {
return ArrayList;
} catch (Exception e) {
// TODO Auto-generated catch block
return null;
}
}
@Override
protected void onPostExecute(ArrayList result) { showInitData(result);
}
@Override
protected void onPreExecute() {
// 显示正在加载状态
loadingView.ShowLoadingStatus();
}
}
4.1.2 HTTP通信
HTTP是Internet中广泛使用的协议,几乎所有的语言和SDK都会不同程度的支持HTTP,在Android SDK中可以采用多种方式使用HTTP,例如HttpURLConnection、HttpGet、HttpPost等。
在这里我们使用HttpURLConnection来访问网络资源,使用java.NET.URL封装HTTP资源的url,并使用openConnection方法获得HttpUrlConnection对象,代码如下:
URL url=new URL(“xxx”);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
设置请求方法,例如GET、Post等,代码如下:
httpURLConnection.setRequestMethod(“POST”);
设置输入输出及其它权限,代码如下:
httpURLConnection.setDoInput(true);
对HTTP资源的读写操作,也就是通过InputStream和OutputStream读取和写入数据。下面的代码获得了InputStream对象和OutPutStream对象。
InputStream is=httpURLConnection.getInputStream();
OutputStream os=httpURLConnection.getOutStream();
最后别忘记关闭输入输出流:
Is.close();
Os.close();
4.1.3 JSON字符解析
与Web服务端进行数据通信最常用的是使用XML进行数据交互,XML数据传送到客户端可以通过Android里的SAX进行解析数据。还有一种现在最流行的数据解析方式:JSON,许多主流的网站都在使用,如:FaceBook、新浪客户端、网易客户端、搜狐客户端等。JSON解析速度快,占用内存小,可以直接将数据解析成ArrayList集合的形式,方便Adapter的使用,但它的缺点是易读性差。
大括号:大括号代表一个JSON对象,{name:xxx;age:11},大括号里面放的是键值对,一个键值对的值又可以是一个JSON对象。
中括号:中括号代表一个JSON数组,比如:[{},{},{},{}],数组的样式
[{"name":"zhangsan","age":20},{"name":"lisi","age":21}]。
为了解析JSON数据,首先要有一个JSONReader对象。初始化JSONReader需要一个StringReader对象做参数。如: JSONReader reader = new JSONReader(new StringReader(JSONData))。
参考代码:
private String JSONdata
="[{\"name\":\"dsa\",\"age\":20},{\"name\":\"dsa\",\"age\":20}]";
JSONReader jreader = new JSONReader(new StringReader(JSONdata));
//1、开始解析一个数组
jreader.beginArray();
//2、jreader.hasNext()这个表示数组里面有没有下一个数组对象
while (jreader.hasNext()) {
//3、开始解析对象
jreader.beginObject();
while (jreader.hasNext()) {
String tagName = jreader.nextName();
//4、解析键值对。。。
if (tagName.equals("name")) {
System.out.println("name===========" + jreader.nextString());
}
if (tagName.equals("age")) {
System.out.println("age=============" + jreader.nextInt());
}
}
//对象解析完毕
jreader.endObject();
}
//数组解析完毕
jreader.endArray();
4.2 自定义组件设计
4.2.1 Tab选项卡界面设计
(1)功能描述:
“高考宝典”Tab选项卡使用的RadioGroup组件进行设计,RadioButton是RaidoGroup的子项,其属性drawableTop可以使图片和文字上下排列。FrameLayout框架布局可以使内部元素之间相互重叠,这样就可以设置漂浮在每个RadioButton上面的焦点图片,默认这些焦点图片为隐藏的。当点击某一个RadioButton,使其设置为选中状态,就可以将“焦点图片”显示的Visible。这样我们就可以看到选项卡被选中的效果。
(2)界面设计:
图4-1 Tab选项卡界面
(3)核心代码:
android:gravity="center_vertical" android:layout_gravity="bottom"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="wrap_content">
android:drawableTop="@drawable/tab_home_bg" style="@style/main_tab_bottom"
android:checked="true" />
android:drawableTop="@drawable/tab_goods_bg" style="@style/main_tab_bottom" />
android:text="高校专业" android:drawableTop="@drawable/tab_shopping_bg"
style="@style/main_tab_bottom" />
android:drawableTop="@drawable/tab_tv_bg" style="@style/main_tab_bottom" />
4.2.2 ListView滑动加载数据模块设计
(1)功能描述:
ListView的滑动加载数据是Android里常用的分页功能,该功能既可以实现分页,又可以体验Android的动画效果。实现ListView滑动加载数据需要先创建AutoRefreshListView类,该类继承与ListView,该类需要实现OnScrollListener接口。ListView在滑动时会促发OnScrollStateChange方法,通过该方法我们可以获得最后一条记录的位置索引,通过监控器Adapter可以得到当前ListView所显示的记录数,如果当前记录数和我们刚才得到的最后一条记录的索引相等的话我们可以通过回调函数继续加载下一页的数据,并将这些数据源绑定到Adapter里面,然后通过NotifyDataSetChanged()方法来更新ListView显示。
当ListView滑动到最后一条数据的时候会出现“正在加载数据…”的提示。
该提示是重写ListView的setAdapter方法来实现的。在setAdapter方法中通过adapter.getCount()方法当前记录数,如果大于分页的条数,让其创建一个动态的Layout,该布局内有一个ProgressBar组件和TextView组件用来显示加载状态。通过addFootView方法将布局加载到ListView组件的最低端。这样就可以看到加载的效果。
(2)界面设计:
图4-2 ListView滑动加载
(3)核心代码:
public void setAdapter(ListAdapter adapter) {
// TODO Auto-gen
上一篇:毕业论文(基于Android的网上订餐系统和原代码)
下一篇:试论APP广告在手机中的应用