zoukankan      html  css  js  c++  java
  • "奇葩家园“之 asyncTask 与 url 下载篇

    asyncTask 是android提供的一个轻量级的异步处理的类,有3个泛型参数,params,progress,result

    params: 启动任务执行的时候传入的参数比如请求的 url 地址

    progress:后台任务执行的百分比

    result:后台任务执行完毕后返回的结果 比如string

    使用asynctask必须要重写2个方法,一个是 doInBackground(Params...) 后台执行的方法,比较耗时的方法,这里不能直接操作ui,可以通过publicProgress(Progress...)来更新任务的进度

    第2个方法是 onPostExecute(Result)相当于handler的处理ui的方式,此方式是任务执行完毕后获取返回的结果,进行下一步的处理。

    还有 比如onPreExecute () 任务执行之前的方法,onCancelled() 用户调用取消时,要做的操作,onProgressUpdate(Progress...)可以使用进度条增加用户的体验度,此方法在主线程上执行,可以操作UI

    注意事项:

    task的实例必须在UI Thread中创建

    execute方法必须在ui thread中调用

    不要手动去调用 onPreExecute()....等方法

    task只能被执行一次,否则多次调用时出现异常

    demo:

    private void asyncTaskGetJson(String params) {
            new AsyncTask<String, Float, String>() {

                @Override
                protected String doInBackground(String... params) {
                    // TODO Auto-generated method stub
                    URL url;
                    StringBuilder sb = new StringBuilder();
                    try {
                        url = new URL(params[0]);
                        URLConnection connection = url.openConnection();
                        float size =  connection.getContentLength();
                        InputStream is = connection.getInputStream();
                        InputStreamReader isr = new InputStreamReader(is);
                        BufferedReader br = new BufferedReader(isr);
                        String line;
                        while ((line = br.readLine()) != null) {
                            sb.append(line);
                            publishProgress((float)sb.toString().length() / size );
                        }
                        br.close();
                        isr.close();
                        is.close();
                        
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    return sb.toString();
                }
                @Override
                protected void onPreExecute() {
                    // TODO Auto-generated method stub
                    Toast.makeText(MainActivity.this, "开始访问sina网", Toast.LENGTH_LONG).show();
                    Log.d("abc", "开始访问sina网");
                }
                @Override
                protected void onPostExecute(String result) {
                    // TODO Auto-generated method stub
                    Toast.makeText(MainActivity.this, "错误请求"+result, Toast.LENGTH_LONG).show();
                    Log.d("abc", "访问完毕,内容"+result);
                }
     
                @Override
                protected void onProgressUpdate(Float... values) {
                    // TODO Auto-generated method stub

                    Toast.makeText(MainActivity.this, "请求"+values[0], Toast.LENGTH_LONG).show();
                }
            }.execute(params);
        }

    调用:
            asyncTaskGetJson("http://www.sina.com");

    上进,务实
  • 相关阅读:
    人间故事馆话题:聊聊那些被骗经历,让其他人不再被骗
    路过的风景
    路过的风景
    上海最适合拍照的旅游地点
    Java EE (11)
    五、服务器端的局域网
    P1294 高手去散步 洛谷
    堆排序【模板】
    P3383 【模板】线性筛素数 洛谷
    P1516 青蛙的约会 洛谷
  • 原文地址:https://www.cnblogs.com/gaonengquan/p/4523928.html
Copyright © 2011-2022 走看看