作者givemepass (〆)
看板AndroidDev
标题Re: [问题] 有关AsyncTask
时间Thu Oct 1 22:15:49 2015
※ 引述《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/cn.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