java多线程

q5661889 2015-09-11 04:29:20
Android主线程中定义了一个toast显示信息的方法,我在子线程中调用主线程中的这个方法,显示错误,我在网上查了说子线程中不能做修改ui的操作,我调用主线程的方法的时候,这个方法是在子线程中执行的吗(就是说系统在子线程中又为这个方法分配了资源,而不是直接在主线程执行这个方法?)
...全文
122 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Arnold9009 2015-09-12
  • 打赏
  • 举报
回复
lz概念不清楚。。。。方法是静态的,不存在属于哪个线程的问题,在哪个线程用调用,就在哪个线程中执行 资源也不存在属于哪个线程的问题(线程本身的资源除外)
  • 打赏
  • 举报
回复
楼主可以试试runOnSystemUi这个方法
erytbc 2015-09-12
  • 打赏
  • 举报
回复
我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。.所以建议详细了解下Handler、Looper、Message、MessageQueue等的区别和联系。
周董的偶像 2015-09-11
  • 打赏
  • 举报
回复
没有“主线程中的方法”和"子线程中的方法" 这种提法。其实Activity 也只是一个类,这个类的实例的方法在一般情况下是可以被任何线程执行的,但是为了减少并发修改UI导致程序的各种混乱和难以调试,所以一般在UI框架中,都只绑定一个线程:即大家所说的主线程(其实也只是一个线程),Android就是如此,规定只能在 main thread 中去修改UI,否则会报错。 Toast是一个UI元素,所以让Toast执行显示的动作,也绑定在了UI线程,别的线程在执行Toast相关的动作的时候,会被先检查是否是UI线程。所以你报错的原因,就是因为非UI线程在执行Toast方法。 所以解决这个问题的办法永远都是在UI线程上执行UI动作,不管用Handler.post也好其它方式也好。
q5661889 2015-09-11
  • 打赏
  • 举报
回复
引用 1 楼 u010911594 的回复:
LZ可以这样使用。在主线程实例化一个handler 然后在子线程调用
	
handler.post(new Runnable() {

			@Override
			public void run() {
				Toast.makeText(context, text, duration);
			}
		});
就不会有问题了,handler可以再子线程通知主线程
我知道解决方法,我是想问子线程调用主线程的方法,是不是说系统在子线程中又为这个方法分配了资源,而不是直接在主线程执行这个方法?
ChenwxJoke 2015-09-11
  • 打赏
  • 举报
回复
LZ可以这样使用。在主线程实例化一个handler 然后在子线程调用
	
handler.post(new Runnable() {

			@Override
			public void run() {
				Toast.makeText(context, text, duration);
			}
		});
就不会有问题了,handler可以再子线程通知主线程

80,360

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧