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/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







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灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP