作者LaPass (LaPass)
看板AndroidDev
标题Re: [问题] 锁住main thread的方法
时间Fri Mar 30 23:40:44 2012
※ 引述《KiroKu ( who)》之铭言:
: 我开了其他thread去下载东西
: 然後main thread要等
是指UI Thread吗?
那千万不要这麽做.........
首先,你可以这样.....
Thread t = new Thread(
new Runnable()
{
void run()
{
// 下载 (略)
runonuithread(new Runnable()
{
void run()
{
//显示下载完成的讯息。 (略)
}
}
);
}
}
);
t.start();
应该看不懂吧?
正常人应该是很难在一瞬间理解包了这麽多层物件啦.....
简单来讲,两个重点
1.千万不要把UIThread卡住
只要五秒没回应,系统就会跳出视窗说这个程式没有回应,问使用者要不要关掉他
可以打一行 systemclock.sleep(10000) 试试看
(这东西跟Thread.sleep(10000)一样,只是不用try... catch... 拦截错误)
2.非UI执行绪不可以变更UI执行绪的Android物件
Android到底有哪些东西不可以让别的执行绪碰我也不清楚
但最基本的 textview.settext("下载完成");
是一定不行的
如果是别的执行绪要变更UI执行绪的东西
就只能用runonuithread(runnable);
把runnable丢进UI执行绪里去执行,这样才能变更UI执行绪里的东西
以上,重点就这两个。
那两个重点结合一下就是上面那个包的好几层的东西
只是平时在写的时候才不会把那些全部都写在一起.....
还有,android SDK好像有推出个物件可以直接在别的执行绪执行
等执行完才会用UI thread去执行显示的动作
不过我没记那个物件的名字....
: 目前写法是
: Dialog dling=new Dialog(context);
: dling.show();
: Thread t=new Thread(...);
: t.start();
: t.join();
: dling.dismiss();
: 可是dialog没有显示出来
: 有没有其他方法呢?
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.233.159.35
1F:推 Azarc:AsyncTask? 03/31 00:24
2F:→ LaPass:应该没错的样子,我记得字看起来的感觉是那样没错.... 03/31 01:15
3F:→ LaPass:我自己用runonuithread用的很习惯,根本不会用到那个东西 03/31 01:15
4F:推 tomap41017:用AsyncTask or Loader才是正解... 04/01 01:19
5F:→ tomap41017:runOnUiThread没有问题,Code丑了点还会隐含Context 04/01 01:19
6F:推 KiroKu:谢谢我会试试的 04/01 12:35
7F:→ Killercat:不过我说真的,从以前到现在都只有coder尽量避免ui 04/01 12:50
8F:→ Killercat:thread的loading, 很少有人想要特地block ui thread的 04/01 12:50
9F:→ Killercat:需求的... XD 04/01 12:50
10F:→ Killercat:如果有需要block ui thread 我会建议检讨一下设计 04/01 12:50
11F:→ Killercat:(这题外话啦 不过真的这需求好怪) 04/01 12:50
12F:推 lovelycateye:用progress bar,on cancel自己处理 04/01 14:50
13F:推 KiroKu:应该是我意思表达不太对吧 就只要防止使用者乱案而已 04/01 16:49
14F:→ Killercat:那就直接盖一个ProgressDialog上去就好了 XD 04/01 19:33
15F:→ Killercat:ProgressDialog基本上就是为了这个设计的 04/01 19:34
16F:→ Killercat:如果你觉得他不好看 就直接在main layout上面再盖一层 04/01 19:34
17F:→ Killercat:layout,然後把onTouch全部拦截起来就可以了 04/01 19:34
18F:→ Killercat:然後你自己在盖上去的layout自己搭想要的图案 04/01 19:35
19F:→ Killercat:再不然最狠的方法 AlertDialog可以设view进去 效果一样 04/01 19:35
20F:→ LaPass:嗯,不想让人点的话,就用楼上的方法盖住吧 04/02 15:24