"奇葩家園「之 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");

相關文章
相關標籤/搜索