AsyncTask的用法

  看到篇不错的的文章,是对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

文章中如果有什么纰漏还请不吝指教。

作者:小文字
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/avenwu/p/2552703.html