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

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

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

    咖啡伴侶

    呆在上海
    posts - 163, comments - 156, trackbacks - 0, articles - 2

    Android線程安全

    Posted on 2010-07-30 11:59 oathleo 閱讀(1340) 評論(1)  編輯  收藏 所屬分類: Android
    很明顯UI上的線程安全在Android上控制的也很嚴格

    如果需要做大運算,取網絡數據等,得用AsyncTask



    AsyncTask

    首先AsyncTask是一個抽象類,子類繼承AsyncTask必須實現其抽象方法doInBackground(Params…)。同時我們還需要實現onPostExecute(Result),因為結果會在Result中返回。

    AsyncTask的生命周期

    AsyncTask的生命周期分為四部分,每部分對應一回調方法,我們只需實現這些方法中的某些需要用到的方法。程序執行過程中這些會自動調用它們。

    • onPreExecute():任務執行之前執行,可在這顯示進度條。
    • doInBackground(Params…):后臺執行,主要用于完成需要任務。執行過程中可以調用publicProgress(Progress…)來更新任務的進度。
    • onProgressUpdate(Progress…):主線程執行,用于顯示任務執行的進度。
    • onPostExecute(Result):主線程執行,任務執行的結果作為此方法的參數返回。

    AsyncTask中的三種泛型

    AsyncTask中的三種泛型類型為Params、Progress、Result。

    • Params:啟動任務參數,比如請求的資源地址。
    • Progress:顧名思義,后臺任務執行的百分比。
    • Result:后臺執行任務返回的結果。

    AsyncTask的執行

    AsyncTask只能在在主線程中創建實例,創建實例后使用execute(params)執行。任務僅會執行一次,如果想再調用就必須創建新的實例。

    具體實現

    首先我們先繼承實現AsyncTask,然后在主線程的getView()里創建其實例execute().

    1、實現AsyncTask

    public class DownImageTask extends AsyncTask {
    private ImageView gView;
     
    protected Bitmap doInBackground(ImageView... views) {
    Bitmap bmp = null;
    ImageView view = views[0];
    HotelListData.Item item;
    // 根據iconUrl獲取圖片并渲染,iconUrl的url放在了view的tag中。
    if (view.getTag() != null) {
    try {
    item = (HotelListData.Item) view.getTag();
    URL url = new URL(item.getI().toString());
    HttpURLConnection conn = (HttpURLConnection) url
    .openConnection();
    conn.setDoInput(true);
    conn.connect();
    InputStream stream = conn.getInputStream();
    bmp = BitmapFactory.decodeStream(stream);
    Data.imageMap.put(item.getId(), bmp);
    stream.close();
    } catch (Exception e) {
    Log.v("img", e.getMessage());
    return null;
    }
    }
    this.gView = view;
    return bmp;
    }
     
    protected void onPostExecute(Bitmap bm) {
    if (bm != null) {
    this.gView.setImageBitmap(bm);
    this.gView = null;
    }
    }

    2、在UI主線程中創建其實例并execute()執行

    HotelListData dlData = new HotelListData();
    HotelListData.Item item = dlData.new Item();
     
    item = (HotelListData.Item) infoVector.getLs().elementAt(position);
    holder.text0.setText(item.getN());
     
    holder.star.setImageDrawable(getResources().getDrawable(
    imageIndex[Integer.parseInt(item.getS().toString())]));
     
    holder.text2.setText(item.getP());
    holder.text3.setText(item.getA());
     
    if (item.getI() != null &amp;&amp; (!item.getI().equals(""))) {
    Bitmap bm = returnBitMap(item.getId());
    if (bm != null) {
    holder.image.setImageBitmap(bm);
    } else {
    if (!holder.image.isDrawingCacheEnabled()
    || !holder.image.getTag().equals(item.getI())) {
    holder.image.setImageResource(R.drawable.img_loading);
    holder.image.setTag(item);
    try {
    new DownImageTask().execute(holder.image);
    holder.image.setDrawingCacheEnabled(true);
    } catch (Exception e) {
    Log.e("error",
    "RejectedExecutionException in content_img: "
    + item.getI());
    }
    }
    }
    }

    簡要

    首先創建了DownImageTask,該類繼承實現了AsyncTask的doInBackground()和onPostExecute(), 如上面所介紹,當在getView中創建實例并execute()傳入需要獲取資源地址URL(地址在TAG中)執行異步線程任務后,程序首先調用 doInBackground()。

    doInBackground()從傳入的Image TAG中獲取資源的URL地址進行圖片的獲取,獲取完畢Retrun結果給onPostExecute(),onPostExecute()里再去做相應的結果處理。



    Feedback

    # re: Android線程安全  回復  更多評論   

    2010-07-31 20:22 by 過路人
    喜歡搞android的牛人
    主站蜘蛛池模板: 日韩精品久久久久久免费| 一级一级毛片免费播放| 在线成人爽a毛片免费软件| 久久被窝电影亚洲爽爽爽| 国产免费人成视频在线播放播| 免费国产成人高清视频网站| 国产亚洲女在线线精品| 亚洲成A人片在线观看中文| caoporm超免费公开视频| 久久久久亚洲av毛片大| 国产午夜精品久久久久免费视| 亚洲精品高清无码视频| 久久青草精品38国产免费| 久久精品蜜芽亚洲国产AV| 无码国产精品一区二区免费| 亚洲中文字幕日本无线码 | 性xxxx视频免费播放直播| 91亚洲精品视频| 免费观看黄网站在线播放| 亚洲国产精品无码中文lv| 一级毛片直播亚洲| 野花香在线视频免费观看大全| 精品亚洲麻豆1区2区3区| 97人伦色伦成人免费视频 | caoporn成人免费公开| 国产亚洲成av人片在线观看| 精品无码AV无码免费专区| 亚洲hairy多毛pics大全| 亚洲一区无码精品色| 中文字幕免费在线观看| 亚洲欧美日韩国产精品一区| JLZZJLZZ亚洲乱熟无码| 最近中文字幕完整免费视频ww| 亚洲欧美乱色情图片| 亚洲一区二区三区无码影院| 先锋影音资源片午夜在线观看视频免费播放 | 亚洲M码 欧洲S码SSS222| 日本在线免费观看| 亚洲高清乱码午夜电影网| 亚洲日韩精品无码一区二区三区 | 亚洲理论片在线中文字幕|