看板 AndroidDev 關於我們 聯絡資訊
※ 引述《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://www.ptt.cc/bbs/AndroidDev/M.1443708953.A.F32.html
loxyz: 推 很好的分享 10/01 22:30
jk262833x: 推 感謝分享 10/01 22:41
htury: 好文 10/02 02:06
lalalalaluk: 推推推 謝謝分享 10/02 08:59
bestpika: 陰人而異有點可怕XD 10/02 10:21
FromTo: 大推,收穫良多。 10/02 10:56
benntqoo: 感謝解說 10/02 13:34
zerofinal: 推 10/02 19:11
issuemylove: 謝主隆恩 10/02 20:24
※ 編輯: givemepass (114.24.52.246), 10/02/2015 22:41:25
lovelycateye: 未看先拜 10/05 16:48
givemepass: 再反拜樓上 10/05 17:25
NeCool: 推 10/06 09:03
kewang: 拜一下你可惡大神!!! 10/08 00:06
rok123kk: 推 10/25 23:50
andrewhanks: 推推 10/27 23:35
han01122: 謝煮隆嗯 12/17 18:00
muimio: 大推~~ 03/03 23:05