生活随笔
收集整理的這篇文章主要介紹了
android 关于多任务下载问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
關(guān)于多任務(wù)下載問(wèn)題
近期項(xiàng)目中,遇到一個(gè)問(wèn)題,列表數(shù)據(jù)中的圖片地址是一個(gè)需要下載JS再解析的字段,之前的圖片下載是一個(gè)異步的過(guò)程,由一個(gè)隊(duì)列處理。
?
Android系統(tǒng)以不同尋常的方式處理多個(gè)應(yīng)用程序的同時(shí)運(yùn)行。來(lái)自于其它不同平臺(tái)的開(kāi)發(fā)者或許會(huì)對(duì)這樣的運(yùn)行機(jī)制感到很奇怪。而理解Android多任務(wù)的運(yùn)行,對(duì)于設(shè)計(jì)出可以良好運(yùn)行的應(yīng)用程序,以及與Android平臺(tái)的其它部分進(jìn)行無(wú)縫結(jié)合都具有重要意義。這篇文章說(shuō)明了Android的多任務(wù)方式設(shè)計(jì)上的成因,它對(duì)應(yīng)用程序運(yùn)行產(chǎn)生的影響,還有你可以怎樣更好地利用Android的這一特性。
近期項(xiàng)目中,遇到一個(gè)問(wèn)題,列表數(shù)據(jù)中的圖片地址是一個(gè)需要下載JS再解析的字段,之前的圖片下載是一個(gè)異步的過(guò)程,由一個(gè)隊(duì)列處理。
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;?????}?}?
現(xiàn)在列表中的圖片信息需要解析,如果再開(kāi)一個(gè)隊(duì)列,頁(yè)面直接卡得不動(dòng)了。。。
然后,這時(shí)候就考濾整個(gè)下載JS然后再下載圖片這個(gè)過(guò)程需要使用同步操作了
后來(lái)發(fā)現(xiàn),這個(gè)過(guò)程操作會(huì)比較長(zhǎng),頁(yè)面的開(kāi)始出現(xiàn)第一項(xiàng)的圖片閃跳
原來(lái)adapter里面的getView 方法,被調(diào)用的過(guò)程中,contentview里面的內(nèi)容會(huì)被隨機(jī)復(fù)用,然后就。。。
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);?????????????????????????????}?????????????????????????});?????????????????????}?????????????????}?????????????});?????????}?????}? 值得注意的一個(gè)問(wèn)題是:
settag的值需要是一個(gè)固定的值。不然,有時(shí)候會(huì)出現(xiàn)加載多次的情況。。
轉(zhuǎn)載于:https://www.cnblogs.com/new0801/p/6175838.html
總結(jié)
以上是生活随笔為你收集整理的android 关于多任务下载问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。