Re: [問題] 有關AsyncTask

看板AndroidDev作者 (〆)時間9年前 (2015/10/01 22:15), 9年前編輯推噓15(1502)
留言17則, 17人參與, 最新討論串2/2 (看更多)
※ 引述《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

10/01 22:30, , 1F
推 很好的分享
10/01 22:30, 1F

10/01 22:41, , 2F
推 感謝分享
10/01 22:41, 2F

10/02 02:06, , 3F
好文
10/02 02:06, 3F

10/02 08:59, , 4F
推推推 謝謝分享
10/02 08:59, 4F

10/02 10:21, , 5F
陰人而異有點可怕XD
10/02 10:21, 5F

10/02 10:56, , 6F
大推,收穫良多。
10/02 10:56, 6F

10/02 13:34, , 7F
感謝解說
10/02 13:34, 7F

10/02 19:11, , 8F
10/02 19:11, 8F

10/02 20:24, , 9F
謝主隆恩
10/02 20:24, 9F
※ 編輯: givemepass (114.24.52.246), 10/02/2015 22:41:25

10/05 16:48, , 10F
未看先拜
10/05 16:48, 10F

10/05 17:25, , 11F
再反拜樓上
10/05 17:25, 11F

10/06 09:03, , 12F
10/06 09:03, 12F

10/08 00:06, , 13F
拜一下你可惡大神!!!
10/08 00:06, 13F

10/25 23:50, , 14F
10/25 23:50, 14F

10/27 23:35, , 15F
推推
10/27 23:35, 15F

12/17 18:00, , 16F
謝煮隆嗯
12/17 18:00, 16F

03/03 23:05, , 17F
大推~~
03/03 23:05, 17F
文章代碼(AID): #1M3K0Pyo (AndroidDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1M3K0Pyo (AndroidDev)