<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    L遷客

    技術博客
    隨筆 - 1, 文章 - 12, 評論 - 1, 引用 - 0
    數據加載中……

    AsyncTask的用法

          在開發Android應用時必須遵守單線程模型的原則: Android UI操作并不是線程安全的并且這些操作必須在UI線程中執行。在單線程模型中始終要記住兩條法則: 
    1.
    不要阻塞UI線程 
    2.
    確保只在UI線程中訪問Android UI工具包 
          
    當一個程序第一次啟動時,Android會同時啟動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,并把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線程。 
          
    比如說從網上獲取一個網頁,在一個TextView中將其源代碼顯示出來,這種涉及到網絡操作的程序一般都是需要開一個線程完成網絡訪問,但是在獲得頁面源碼后,是不能直接在網絡操作線程中調用TextView.setText().因為其他線程中是不能直接訪問主UI線程成員

    android提供了幾種在其他線程中訪問UI線程的方法。 
    Activity.runOnUiThread( Runnable )
     
    View.post( Runnable )
     
    View.postDelayed( Runnable, long )
     
    Hanlder
     
    這些類或方法同樣會使你的代碼很復雜很難理解。然而當你需要實現一些很復雜的操作并需要頻繁地更新UI時這會變得更糟糕。 

        
    為了解決這個問題,Android 1.5提供了一個工具類:AsyncTask,它使創建需要與用戶界面交互的長時間運行的任務變得更簡單。相對來說AsyncTask更輕量級一些,適用于簡單的異步處理,不需要借助線程和Handler即可實現。 
    AsyncTask
    是抽象類.AsyncTask定義了三種泛型類型 ParamsProgressResult 
      Params 啟動任務執行的輸入參數,比如HTTP請求的URL 
      Progress 后臺任務執行的百分比。 
      Result 后臺執行任務最終返回的結果,比如String 

         AsyncTask
    的執行分為四個步驟,每一步都對應一個回調方法,這些方法不應該由應用程序調用,開發者需要做的就是實現這些方法。 
      1) 子類化AsyncTask 
      2) 實現AsyncTask中定義的下面一個或幾個方法 
         onPreExecute(), 該方法將在執行實際的后臺操作前被UI thread調用。可以在該方法中做一些準備工作,如在界面上顯示一個進度條。 
        doInBackground(Params...), 將在onPreExecute 方法執行后馬上執行,該方法運行在后臺線程中。這里將主要負責執行那些很耗時的后臺計算工作。可以調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。 
        onProgressUpdate(Progress...),publishProgress方法被調用后,UI thread將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。 
        onPostExecute(Result), doInBackground 執行完成后,onPostExecute 方法將被UI thread調用,后臺的計算結果將通過該方法傳遞到UI thread. 

    為了正確的使用AsyncTask類,以下是幾條必須遵守的準則: 
      1) Task的實例必須在UI thread中創建 
      2) execute方法必須在UI thread中調用 
      3) 不要手動的調用onPreExecute(), onPostExecute(Result)doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法 
      4) task只能被執行一次,否則多次調用時將會出現異常 
          doInBackground
    方法和onPostExecute的參數必須對應,這兩個參數在AsyncTask聲明的泛型參數列表中指定,第一個為doInBackground接受的參數,第二個為顯示進度的參數,第第三個為doInBackground返回和onPostExecute傳入的參數。


    從網上獲取一個網頁,在一個TextView中將其源代碼顯示出來

     

    package test.list;
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.util.ArrayList;

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;

    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    public class NetworkActivity extends Activity{
        
    private TextView message;
        
    private Button open;
        
    private EditText url;

        @Override
        
    public void onCreate(Bundle savedInstanceState) {
           
    super.onCreate(savedInstanceState);
           setContentView(R.layout.network);
           message= (TextView) findViewById(R.id.message);
           url= (EditText) findViewById(R.id.url);
           open= (Button) findViewById(R.id.open);
           open.setOnClickListener(
    new View.OnClickListener() {
               
    public void onClick(View arg0) {
                  connect();
               }
           });

        }

        
    private void connect() {
            PageTask task = 
    new PageTask(this);
            task.execute(url.getText().toString());
        }


        
    class PageTask extends AsyncTask<String, Integer, String> {
            
    // 可變長的輸入參數,與AsyncTask.exucute()對應
            ProgressDialog pdialog;
            
    public PageTask(Context context){
                pdialog = 
    new ProgressDialog(context, 0);   
                pdialog.setButton("cancel", 
    new DialogInterface.OnClickListener() {
                 
    public void onClick(DialogInterface dialog, int i) {
                  dialog.cancel();
                 }
                });
                pdialog.setOnCancelListener(
    new DialogInterface.OnCancelListener() {
                 
    public void onCancel(DialogInterface dialog) {
                  finish();
                 }
                });
                pdialog.setCancelable(
    true);
                pdialog.setMax(100);
                pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                pdialog.show();


            }
            @Override
            
    protected String doInBackground(String... params) {

                
    try{

                   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;

                       
    int 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;
                } 
    catch(Exception e) {
                   e.printStackTrace();

                }

                
    return null;

            }

            @Override
            
    protected void onCancelled() {
                
    super.onCancelled();
            }

            @Override
            
    protected void onPostExecute(String result) {
                
    // 返回HTML頁面的內容
                message.setText(result);
                pdialog.dismiss(); 
            }

            @Override
            
    protected void onPreExecute() {
                
    // 任務啟動,可以在這里顯示一個對話框,這里簡單處理
                message.setText(R.string.task_started);
            }

            @Override
            
    protected void onProgressUpdate(Integer... values) {
                
    // 更新進度
                  System.out.println(""+values[0]);
                  message.setText(""+values[0]);
                  pdialog.setProgress(values[0]);
            }

         }

    }

     

    posted on 2013-02-24 16:35 L遷客 閱讀(48) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 国产AV无码专区亚洲AV漫画| 免费在线视频一区| 亚洲不卡av不卡一区二区| 一级毛片视频免费观看| 国产成人精品免费视频大全五级| 色综合久久精品亚洲国产| 成年女性特黄午夜视频免费看| 亚洲av无码片在线观看| 中文字幕无码视频手机免费看 | 久久精品国产亚洲AV麻豆网站| 最近免费mv在线观看动漫 | 亚洲一区二区视频在线观看| 猫咪免费人成在线网站| 亚洲日韩在线第一页| 两个人的视频www免费| 亚洲av永久无码精品漫画| 91精品全国免费观看含羞草| 亚洲成年人电影网站| 免费av欧美国产在钱| 国产精品亚洲综合一区在线观看| av无码东京热亚洲男人的天堂| a级毛片免费观看网站| 亚洲AV无码成人网站久久精品大| 一级毛片成人免费看免费不卡| 亚洲国产高清视频在线观看| 成年性生交大片免费看| 免费看又黄又爽又猛的视频软件| 国产成人亚洲精品91专区手机| 最近免费字幕中文大全| 亚洲精品在线播放| 精品少妇人妻AV免费久久洗澡 | 91麻豆国产自产在线观看亚洲 | 国产成人综合亚洲AV第一页| 无码精品人妻一区二区三区免费看| 亚洲综合小说久久另类区| 啦啦啦www免费视频| 抽搐一进一出gif免费视频| 亚洲国产精品乱码在线观看97| 日韩在线免费播放| 丁香花在线视频观看免费| 亚洲日韩在线视频|