一个神奇的BUG,高分悬赏

j_f0001 2013-12-17 11:30:46
public class BounceListViewActivity extends Activity {
/** Called when the activity is first created. */

TextView txt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

txt=(TextView)findViewById(R.id.txt);

new Handler().post(null);

new Thread(new Runnable() {

@Override
public void run() {
txt.setText("dddd");
txt.setText("dfff");

}
}).start();

}
}
这样运行起来,程序为什么不崩溃?
把run改成这样就崩溃,这又是为什么?
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
txt.setText("dddd");
txt.setText("dfff");

}
...全文
533 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
凉凉二点凉 2013-12-18
  • 打赏
  • 举报
回复
       runOnUiThread(new Runnable() {
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
        }
    })
kldou666 2013-12-18
  • 打赏
  • 举报
回复
1、new Handler().post(null); 由于放的是个null, 所以这句话毫无意义,若改成去post一个实实在在的Runnabale,像这样: new Handler().post(mRunnable); Runnable mRunnable = new Runnable() { @Override public void run() { } }; 如果这样的话,不管run里面是不是休眠一秒再处理ui,都不会报错,因为不会影响到ui主线程的操作。 2、new 一个线程去处理ui的话,由于一秒后ui主线程已绘制完毕,再在run里面去修改ui,就会报错啦!
半边椅子 2013-12-18
  • 打赏
  • 举报
回复
另外你第一句new Handler().post(null);什么都没放进去 要注意通过new Handler().post(runnable)的线程,是在主线程里直接去执行这个runnable的run方法,而不是运行子线程
半边椅子 2013-12-18
  • 打赏
  • 举报
回复
所有对于控件(Button,TextView等等)的操作,都不能直接放在子线程里操作,而要通过Handler来异步处理。 你这里直接在子线程里给TextView赋值,当然会报错咯! 不过有一个控件是例外的,那就是ProgressBar,不过也只是针对它独有的操作比如setMax(),setProgress()这些是可以放在子线程操作的,但是setVisibility()比如像这个是继承自View,所有的控件都有,那么依然不能放在子线程里来操作。
Birds2018 2013-12-18
  • 打赏
  • 举报
回复
我到觉得 有点类似于 canvas缓冲绘图一样,在线程里面绘制好了 ,没显示的时候 用线程修改是无错误的, 当你加入到窗体的时候 就不能用子线程直接修改了。
Birds2018 2013-12-18
  • 打赏
  • 举报
回复
这个以前我也尝试过, 个人认为是这样的: 当你打开一个应用时 一般都有黑屏一下,在黑屏那一瞬间 你的onCreate开始执行, 屏幕显示时 线程已经执行完了,所以没有报错。 当如果你加了sleep 休眠一下 等屏幕显示好了,休眠可能还未结束 线程就无法修改主线程的UI了。 如果深入研究估计要看视图显示的在窗体上 做了哪些特别的操作,以至于子线程不能修改主线程的UI。 WindowManager.
  • 打赏
  • 举报
回复
txt.post(new Runnable() { @Override public void run() { txt.setText("dddd"); txt.setText("dfff"); } });
  • 打赏
  • 举报
回复
下面的run,在sleep之后,要改UI线程得用handler了
iltgcl 2013-12-18
  • 打赏
  • 举报
回复
子線程不要直接操作UI
ARy 2013-12-18
  • 打赏
  • 举报
回复
有多神奇,没看出来为什么会崩溃,求解答
Birds2018 2013-12-18
  • 打赏
  • 举报
回复
误打误撞的 有时候居然写对了。
j_f0001 2013-12-18
  • 打赏
  • 举报
回复
引用 5 楼 birdsaction 的回复:
这个以前我也尝试过, 个人认为是这样的: 当你打开一个应用时 一般都有黑屏一下,在黑屏那一瞬间 你的onCreate开始执行, 屏幕显示时 线程已经执行完了,所以没有报错。 当如果你加了sleep 休眠一下 等屏幕显示好了,休眠可能还未结束 线程就无法修改主线程的UI了。 如果深入研究估计要看视图显示的在窗体上 做了哪些特别的操作,以至于子线程不能修改主线程的UI。 WindowManager.
据说有这样的解释 1.当onCreate的时候,UI线程还没有创建完成,在这个时候,new Thread()就是一个线程在操作UI,所以不存在线程同步的问题 2.之所以不能在子程操作UI,那是因为不能在子线程操作UI线程,而在onCreate的时候,主线程还没有创建完成,这个时候只有new Thread()线程,所以new Thread()就是主线程,所以在这个时候就不存在子线程操作主线程的线程 以上是在网上看到的,希望对你有所帮助。
j_f0001 2013-12-18
  • 打赏
  • 举报
回复
引用 3 楼 cclovescw 的回复:
下面的run,在sleep之后,要改UI线程得用handler了
为什么不sleep()就没有问题呢?
xiaanming 2013-12-18
  • 打赏
  • 举报
回复
上面很多朋友都给给出了解答 帮我戳一下http://vote.blog.csdn.net/blogstaritem/blogstar2013/xiaanming
计算机刘老师 2013-12-18
  • 打赏
  • 举报
回复
new Handler().post(null);//无意义 ui主线程绘制完毕,再在run里面去修改ui,就会报错
打开链接下载源码: https://pan.quark.cn/s/589796089f72 C++课程设计任务列表,涵盖以下内容:1、识别并显示10至99范围内,各位数乘积超过各位数和的数值,例如数字12不满足条件,因为1乘以2小于1加2,故不输出;而数字27满足条件,因为2乘以7大于2加7,因此需要输出该数。2、开发一个功能,用于从用户输入的任意数量实数中找出最大值与最小值:首先要求用户输入一个正整数n,代表数值的个数,随后用户可输入任意n个实数,程序需找出这n个数中的最大值和最小值并将它们展示出来。3、实现两个已排序数组的合并操作:设有数组A和B,且假设这两个数组的元素均已按照降序排列。编写程序将A和B合并成一个新的数组C,并确保C中的元素同样保持降序排列。int A[10]={123, 86,80, 49,33,15,7,0,-1,-3};int B[10]={100,64,51,50,27,19,15,12,5,2};4、设计一个函数,用于计算特定分数序列前n项的总和,该序列为1/2,1/3,1/4,1/5,1/6,1/7,...。要求在主程序中提示用户输入一个整数n,并验证输入的合法性(n需大于1方为有效),若输入合法,则调用求和函数并显示计算结果。5、编写一个程序,计算两个用户输入日期之间的天数差:用户需以year1,month1,day1和year2,month2,day2的格式输入两个日期,程序随后计算这两个日期之间的天数间隔,并将结果输出到屏幕上。要求编制具有如下原型的函数difs2Date:long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2);并在主函数中调用此函数,将计...
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...
源码链接: https://pan.quark.cn/s/a4b39357ea24 小程序雷达 AI 驱动的小程序生态选型与风险评估工具,把微信小程序开发资源转化为可筛选、可评估、可对比的技术雷达。 线上地址 主站: Vercel: 适合谁 正在做微信小程序技术选型的产品、研发和架构团队。 需要判断 Taro、uni-app、原生小程序、组件库、云开发和 SDK 风险的团队。 需要把历史 awesome 列表转成可筛选、可对比、可验证技术雷达的维护者。 可以做什么 Radar:按推荐状态、风险等级、资源类型、分类和适用场景浏览小程序生态资源。 Quick Search:快速搜索资源并跳转常用页面。 Compare:对比 Taro、uni-app、原生小程序等核心方案。 Advisor:输入选型问题,获得推荐结论、适用/不适用条件、迁移成本、下一步和证据来源。 Doctor:粘贴小程序项目配置,识别框架依赖、过时方案和迁移风险。 Weekly:查看小程序生态周报和近期风险信号。 数据概览 当前数据集中包含 236 个小程序生态资源。 完整资源可在 Radar 页面和导出能力中查看。 核心样例 Taro ★30.6k+ - 使用 React 的方式开发小程序的框架,同时支持生成多端应用 uni-app ★36.1k+ - 使用 Vue 语法开发小程序、H5、App的统一框架 MPX ★2.1k+ - 增强型小程序框架,深度性能优化,支持跨小程序平台开发,完全兼容原生小程序组件 WePY ★21.7k+ - 支持组件化的小程序开发框架 vant-weapp ★12.3k+ - 高颜值、好用、易扩展的微信小程序 UI 库 tdesign-miniprogram ★1.3...

80,488

社区成员

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

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