AndroidDev 板


LINE

※ 引述《benntqoo (戰鬥魯)》之銘言: : 各位前輩好! : 最近在練習自己寫一個程式藉由JSON取得資料從JSON取得的資料放入ListView。 : 目前我是利用AsyncTask在 doInBackground 上處理JSON資料。 : 處理過後的資料利用我自己建立的VO class。 : 自己寫一個BaseAdapter處理ListView裡面Item。 : 最後在OnPostExectue setAdapter 動態更新ListView。 : 目前寫到這裡都有達到我想要的目的。 : 可是後來想想我如果在APP執行途中新增JSON內容。 : AsyncTask好像就不會動態更新。 : 上網查一下資料好像可以利用Service 背景執行寫一個定時更新的服務。 : 我朋友也告訴我要利用Handler處理UI畫面不要寫在AsyncTask裡面。 : 可能功力還不太夠我把我的MainActivity裡面寫入AsyncTask和BaseAdapter...。 : 沒有而外再開Class寫。 : 寫要寫Service的時候發現不太會處理數值也不太會改寫。 : 有找到寫一個Service 裡面可以用TimerTask。 : 請問我是要利用TimerTask處理JSON資料。 : 還是使用TimerTask去處理我的AsyncTask? : 最近腦子卡死在這裡有一點不知道要如何下手。 : 本來是寫一個Therd去去算秒數時間到了執行AsyncTask再利用Handler處理畫面。 : 可是會發生Runtime Exception。 : 說要把handler static 不然會發生overload。 : 又看了很多相關文章越看越一頭霧水。 : 自己覺得這是有關於觀念問題但是身邊沒什麼人可以問。 : 我朋友只說只能指點我這些剩下靠我自己。 : 只好PO文求助大家。 : 另外如果有關於寫作技巧或是方式有推薦的書籍可以閱讀? : 希望前輩可以指導一下寫作方式或技巧。 : 感謝。 稍微解釋一下 有錯請鞭 Handler android thread用來傳遞訊息溝通的東西 他會將Message傳入MessageQueue內 由Looper進行分派 每一個Message都知道自己的Handler 每一個Thread只會有一個Looper 每一個Thread可以有很多Handler Android一開始會啟動一個Thread 稱做Main Thread 並且會啟動一個Looper專門來處理訊息 只是這個Looper比較特別 他是在程式結束之前都不會停止 而且你強制停止它還會跳出Exception 這也就是為什麼你可以一直 new Handler(getMainLooper()).post(Message or Runnable); 來處理UI。 當然, 你也可以自己建立一個MessageQueue, 並且建立一個Looper來派送, 那麼就要自己管理這個Looper, 一開始要prepare結束要quit它。 如果嫌麻煩 你就可以使用HanlderThread。 HandlerThread用起來跟一般的Thread一樣, 每次new完只能使用一次, 用完即丟。 他的好處是單一執行緒循序處理Message, 因此是執行緒安全, 如果你想要執行某些任務完, 接著執行下一個任務 一般會這樣做 new Thread(new Runnable(){ public void run(){ //執行任務一 mContext.runUiThread(new Runnable(){ public void run(){ //更新UI new Thread(new Runnable(){ public void run(){ //執行任務二 } }).start(); } }); } }).start(); 這樣縮排會越來越長 如果使用HanlderThread就可以 mHandlerThread = new HanlderThread("my handler thread"); mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); mHandler.post(/*任務一*/); runUiThread(new Runnable(){ public void run(){ //更新UI mHandler.post(/*任務二*/); mHandler.post(/*任務三*/); } }); 程式是否乾淨多了? 那一個Thread不夠用 怎麼辦? 那你有沒有開第二個? 但是如果開多個就會出現管理上的問題 所以就出現ThreadPool可以幫你管理, 他是利用Executor框架實作, 他有提供預設的Executors讓你使用, 例如 newFixedThreadPool newCachedThreadPool newSingleThreadExecutor 當然你也可以自訂 ThreadPoolExecutor executor = new ThreadPoolExecutor( int corePoolSize, int maxPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue ); 這部份就不多說了 使用上非常簡單 還可以搭配Callable或Runnable interface進行操作 由於上面這些其實管理上可能需要注意很多地方 如果嫌麻煩 你可以使用AsyncTask class MyTask extends AsyncTask<Params, Progress, Result>{ protected void onPreExecute(){ // in main thread } protected Result doInBackground(Params... params){ // in background thread } protected void onProgressUpdate(Progress... progress){ // in main thread } protected void onPostExecute(Result result){ // in main thread } protected void onCancelled(Result result){ // in main thread } } 使用上非常簡單 但是要注意AsyncTask一次只能執行一次 所以當你還想繼續用的時候 就要new新的 onPreExecute 是你準備要執行的工作 doInBackground 這邊相當於你開一個Thread來操作 可以用來操作比較久一點的工作 onPostExecute 是你執行完 並且可以在這邊更新UI onCancelled跟onPostExecute只會呼叫一個 onProgressUpdate由於你可以執行多個任務 所以你也可以算進度 如果你一次塞多個任務給他 asyncTask.exectue(task1, task2, task3, ...); 那麼他就會像前面HandlerThread一樣進行任務上的排隊 如果你想要讓他們並行 那麼就是 asyncTask1.exectue(task1); asyncTask2.exectue(task2); asyncTask3.exectue(task3); 但是AsyncTask是共同維護一個ThreadPool 由於AsyncTask內部有core Thread數量的管制 所以當你多個任務並行 可能會導致後面的任務在排隊 進而影響app的效率 所以你也可以自己定義Executor給噁心Task 或者改用ThreadPool 如果循序的任務又不想開太多Thread就可以使用HandlerThread 每一種模式都有自己好用的地方跟極限 使用情境上陰人而異 分享一下自己的觀念 如果有寫不對的地方 在麻煩告知一下 謝謝 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.151.182
※ 文章網址: https://webptt.com/m.aspx?n=bbs/AndroidDev/M.1443708953.A.F32.html
1F:推 loxyz: 推 很好的分享 10/01 22:30
2F:推 jk262833x: 推 感謝分享 10/01 22:41
3F:推 htury: 好文 10/02 02:06
4F:推 lalalalaluk: 推推推 謝謝分享 10/02 08:59
5F:→ bestpika: 陰人而異有點可怕XD 10/02 10:21
6F:推 FromTo: 大推,收穫良多。 10/02 10:56
7F:推 benntqoo: 感謝解說 10/02 13:34
8F:推 zerofinal: 推 10/02 19:11
9F:推 issuemylove: 謝主隆恩 10/02 20:24
※ 編輯: givemepass (114.24.52.246), 10/02/2015 22:41:25
10F:推 lovelycateye: 未看先拜 10/05 16:48
11F:→ givemepass: 再反拜樓上 10/05 17:25
12F:推 NeCool: 推 10/06 09:03
13F:推 kewang: 拜一下你可惡大神!!! 10/08 00:06
14F:推 rok123kk: 推 10/25 23:50
15F:推 andrewhanks: 推推 10/27 23:35
16F:推 han01122: 謝煮隆嗯 12/17 18:00
17F:推 muimio: 大推~~ 03/03 23:05







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP