Re: [問題] 有關AsyncTask
※ 引述《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
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
討論串 (同標題文章)
AndroidDev 近期熱門文章
PTT數位生活區 即時熱門文章