"奇葩家园“之 asyncTask 与 url 下载篇

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

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

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

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

 

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

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

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

注意事项:url

task的实例必须在UI Thread中建立线程

execute方法必须在ui thread中调用orm

不要手动去调用 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");

相关文章
相关标签/搜索