生活随笔
收集整理的這篇文章主要介紹了
android 关于多任务下载问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于多任務下載問題
近期項目中,遇到一個問題,列表數據中的圖片地址是一個需要下載JS再解析的字段,之前的圖片下載是一個異步的過程,由一個隊列處理。
?
Android系統以不同尋常的方式處理多個應用程序的同時運行。來自于其它不同平臺的開發者或許會對這樣的運行機制感到很奇怪。而理解Android多任務的運行,對于設計出可以良好運行的應用程序,以及與Android平臺的其它部分進行無縫結合都具有重要意義。這篇文章說明了Android的多任務方式設計上的成因,它對應用程序運行產生的影響,還有你可以怎樣更好地利用Android的這一特性。
近期項目中,遇到一個問題,列表數據中的圖片地址是一個需要下載JS再解析的字段,之前的圖片下載是一個異步的過程,由一個隊列處理。
public?class?ImageTaskExecutor?{????????????private?LinkedList<ImageTask>?mTaskQueue?=?null;????????????private?ThreadUnit?mThreadUnit?=?null;???????????????public?static?final?long?WAIT_PERIOD?=?50L;??????????private?volatile?boolean?paused;?????private?final?Object?signal?=?new?Object();????????????????????public?synchronized?boolean?addNewTask(final?ImageTask?task)?{?????????if?(mThreadUnit?==?null)?{?????????????mThreadUnit?=?new?ThreadUnit();?????????????mTaskQueue?=?new?LinkedList<ImageTask>();?????????????new?Thread(mThreadUnit).start();?????????}??????????????????return?mTaskQueue.offer(task);?????}???????class?ThreadUnit?implements?Runnable?{???????????public?boolean?isRunning?=?false;?????????private?ImageTask?task?=?null;???????????@Override?????????public?void?run()?{?????????????try?{?????????????????isRunning?=?true;?????????????????while?(isRunning)?{?????????????????????while?(mTaskQueue?!=?null?&&?mTaskQueue.isEmpty())?{?????????????????????????try?{?????????????????????????????Thread.sleep(WAIT_PERIOD);?????????????????????????}?catch?(InterruptedException?e)?{?????????????????????????????e.printStackTrace();?????????????????????????}?????????????????????}?????????????????????synchronized?(signal)?{?????????????????????????while?(paused)?{??????????????????????????????signal.wait();?????????????????????????}?????????????????????}?????????????????????if?(mTaskQueue?!=?null?&&?!mTaskQueue.isEmpty())?{?????????????????????????task?=?mTaskQueue.removeFirst();??????????????????????????if?(task?!=?null)?{?????????????????????????????task.execute();?????????????????????????}?????????????????????}?????????????????}??????????????}?catch?(Exception?e)?{?????????????????e.toString();?????????????}?????????}??????}?????????????????public?void?pauseTaskThread()?{?????????setPaused();?????}??????????private?void?setPaused()?{?????????synchronized?(signal)?{?????????????paused?=?true;?????????}?????}???????private?void?setUnpaused()?{?????????synchronized?(signal)?{?????????????paused?=?false;?????????????signal.notify();?????????}?????}?????????????????public?void?resumeTaskThread(){?????????setUnpaused();?????}???????????????????public?void?terminateTaskThread()?{?????????if?(mThreadUnit?!=?null)?{?????????????mThreadUnit.isRunning?=?false;?????????}?????????if?(mTaskQueue?!=?null)?{?????????????mTaskQueue.clear();?????????}?????????mThreadUnit?=?null;?????????mTaskQueue?=?null;?????}?}?
現在列表中的圖片信息需要解析,如果再開一個隊列,頁面直接卡得不動了。。。
然后,這時候就考濾整個下載JS然后再下載圖片這個過程需要使用同步操作了
后來發現,這個過程操作會比較長,頁面的開始出現第一項的圖片閃跳
原來adapter里面的getView 方法,被調用的過程中,contentview里面的內容會被隨機復用,然后就。。。
public?void?inflateTaobaoImage(final?String?jsonUrl,?final?View?view,?????????????final?int?error_bg_Id)?{?????????if?(jsonUrl?==?null?||?jsonUrl.equals(""))?{?????????????return;?????????}???????????String?imgUrl?=?getImgUrl(jsonUrl);?????????if?(!TextUtils.isEmpty(imgUrl))?{?????????????final?String?originJsonUrl?=?(String)?view.getTag(IMG_TAG);?????????????if?(TextUtils.equals(originJsonUrl,?jsonUrl))?{?????????????????LogsPrinter.debugError(TAG,?"inflateTaobaoImage?in?HashMap?"?????????????????????????+?originJsonUrl?+?"?"?+?view);?????????????????inflateImage(imgUrl,?view,?error_bg_Id);?????????????}?????????}?else?{?????????????mTaskExecutor.addNewTask(new?ImageTask(jsonUrl)?{?????????????????@Override?????????????????public?void?execute()?{?????????????????????String?taobaoImgUrl?=?downloadUrlString(jsonUrl?????????????????????????????+?"&callback=success_jsonpCallback");???????????????????????final?String?imgUrl?=?getTaobaoImageUrl(taobaoImgUrl);?????????????????????LogsPrinter.debugError("add?map",?imgUrl?+?"?"?+?jsonUrl);?????????????????????taobaoImgMap.add(imgUrl,?jsonUrl);???????????????????????final?String?originJsonUrl?=?(String)?view.getTag(IMG_TAG);?????????????????????if?(TextUtils.equals(originJsonUrl,?jsonUrl))?{?????????????????????????baseHandlers.post(new?Runnable()?{???????????????????????????????@Override?????????????????????????????public?void?run()?{?????????????????????????????????inflateImage(imgUrl,?view,?error_bg_Id);?????????????????????????????}?????????????????????????});?????????????????????}?????????????????}?????????????});?????????}?????}? 值得注意的一個問題是:
settag的值需要是一個固定的值。不然,有時候會出現加載多次的情況。。
轉載于:https://www.cnblogs.com/new0801/p/6175838.html
總結
以上是生活随笔為你收集整理的android 关于多任务下载问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。