看到篇不错的的文章,是对AsyncTask的使用分析,具体请移步至 悟道:http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html
文章总体上写的还比较清楚,其中呢有几个细节要注意:
1.凡是联网操作,一定要记得有相应权限:<uses-permission android:name="android.permission.INTERNET" />
2.url地址是带http://的,由于打开浏览器时,我们往往会省略http://,因为浏览器会自动补充,所以别忘了,不然会出的错误提示:
W/System.err(278): java.lang.IllegalStateException: Target host must not be null, or set in parameters.
3.原作者在联网获取网页数据的时候,用了以下操作:
HttpClient client = new DefaultHttpClient(); // params[0]代表连接的url HttpGet get = new HttpGet(params[0]); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); String s = null; if (is != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[128]; int ch = -1, count = 0; while ((ch = is.read(buf)) != -1) { baos.write(buf, 0, ch); count += ch; if (length > 0) { // 如果知道响应的长度,调用publishProgress()更新进度 publishProgress((int) ((count / (float) length) * 100)); } // 让线程休眠100ms Thread.sleep(100); } s = new String(baos.toByteArray()); } // 返回结果 return s;
关于联网取数据的方法很多,主要看采用何种方式联网请求,这里简单写一下,具体的话,有待进一步学习java网络编程的知识。
1.基于url的网络编程,即用Java.net中HttpURLConnection的话可以这样操作,
a.首先构造URL;
b.然后打开连接connection;
c.再取得inputStream;
d.最后可以操作inputstream,一般也是用一个while循环,将数据放到outputStream
2.或者基于客户端网络编程,即可以用apache中HttpClient,那么代码上肯定是有点区别的,上面的文章中就是用的这种方式:
a.首先实例化一个客户端,HttpClient;
b.选择请求方式,可以是Get方式,并设置url参数;
c.发起请求即执行execute,获得响应response;
d.从响应中获取inputstream;
e.这一步就一样了,操作InputStream
那么这两种方法在本文中选择第二种,因为它可以根据响应直接获取网络资源的大小也就是这句代码
long length = entity.getContentLength();
,而URL方式,我没发现有对应方法,应该是不可以的,我们要实现进度条的话,必须有一个已下载的百分比。
网上看了下csdn有篇文章专门介绍了网络编程,他讲的很多,有待考证,
这是地址http://blog.csdn.net/csh624366188/article/details/7331716
最后呢,我把完整代码打包出来了:TestAsyncTask.7z
文章中如果有什么纰漏还请不吝指教。