zoukankan      html  css  js  c++  java
  • 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

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

    作者:小文字
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    SSH应用
    [数字信号处理]IIR滤波器的间接设计(C代码)
    C#调用ATL COM
    【deep learning学习笔记】最近读的几个ppt(未完...)
    程序中输出两位小数
    Exchange Server 2007 部署:安装时的 10 条提示
    中兴通讯变卖资产首季实现扭亏
    iPhone市场份额急跌 苹果亟需新产品确保市场地位
    如何做一个真正牛X 的开源项目
    提高PHP编程效率的53种方法
  • 原文地址:https://www.cnblogs.com/avenwu/p/2552703.html
Copyright © 2011-2022 走看看