2 ght957733257 ght957733257 于 2016.02.04 23:08 提问

在安卓中开启一个新线程,发现如下代码中if块是DeadCode?为什么,如何解决?

new Thread(){
public void run(){
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(hasData < 100){
progressStatus = progressStatus + (int)(Math.random() * 10);
handler.sendEmptyMessage(0x123);
// if(hasData >= 100){
// Toast.makeText(MainActivity.this,"耗时任务已完成",1).show();
// }
}

        }
    }.start();
}
备注progressStatus和handler已经在上面声明了。

3个回答

leilba
leilba   Rxr 2016.02.04 23:20
已采纳
 while(hasData < 100){
progressStatus = progressStatus + (int)(Math.random() * 10);
handler.sendEmptyMessage(0x123);
// if(hasData >= 100){
// Toast.makeText(MainActivity.this,"耗时任务已完成",1).show();
// }
}

从这块代码分析可知,有几种情况:
1.如果原先 hasData >= 100的话,根本就不会进入到这个while循环中,那么就不会执行if
2.如果原先hasData < 100 , 那么会进入到while中,但是while中没有改变hasData值的方法,那么只会在while中死循环,永远不会执行if
3.如果原先hasData < 100,那么会进入到while中,而且通过handler.sendEmptyMessage(0x123);发送的请求,会改变hasData的值,但是,由于handler的执行相比当前thread是异步的,其触发时机会存在不确定性,所以不知道hasData的值会是在while判断前改变还是在if判断钱改变,所以也会导致if里面的内容不起作用

caozhy
caozhy
2 年多之前 回复
devmiao
devmiao   Ds   Rxr 2016.02.05 07:24

while(hasData < 100)
所以>=100不可能发生

a774057695
a774057695   2016.02.05 10:53

逻辑错误,就像这样:
if(true) {
if(false) {
//Are you just kidding me?
}
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android 开启一个新线程
package com.example.che;import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.widget.TextView; public class MainActivity extends Activity { TextView tv01;
Android开启子线程
1.什么是主线程(UI线程)   当应用程序启动的时候,Android首先会开启一个主线程(UI线程)   主线程管理界面中的UI控件,进行事件分发 2.什么情况下开启子线程   进行耗时操作或者网络请求的时候开启子线程  比如:  //获取控件  TextView textView = (TextView)findViewById(R.id.textView);  //开启子线程5
Android 开启新线程
Android 开启新线程标签(空格分隔): 未分类Android 开启新线程 直接创建子线程并启动 先创建线程然后启动 开启新的线程2种简单常用的方法:① 直接创建子线程,并启动;private Thread newThread; //声明一个子线程 new Thread() { @Override public void run() {
java方法中启动一个新的线程
1 要想在java方法中启动一个新的线程。通过new Thread(){public void run(){...}}.start()即可。 如:public static void main(String[] args) { System.out.println("新建议一个线程"); //启动一个新的线程 new Thread(){ public void run(){ Sys
android 快速创建一个新的线程
http://blog.sina.com.cn/s/blog_71dbc27f01017mnj.html 第一种:直接创建子线程并启动       new Thread() { @Override public void run() {      //这里写入子线程需要做的工作         }    }.start();     第二种:先创建子线程,然后启动  
android中线程的开启,访问网络
方式1 new Thread(runnableDjangoRegister).start();//注册 public Runnable runnableDjangoRegister = new Runnable() { @Override public void run() { Log.e("runnableD
在Activity中开启新线程注意问题
很多人认为,在Activity中new出来的线程,会在Activity销毁的时候线程同时被销毁,事实上,这是一个错误的观点。 Activity new出来的新线程是运行在另非主线程上的,Activity销毁的本质是执行了onDestroy()这个生命周期方法,工作线程不会受到Activity销毁的影响。 当Activity启动的新线程执行的是一个死循环操作的时候,新线程会一直运行着,即使是Act
android 线程里面再开新的的线程
当 一个线程里面开另外一个线程的时候,需要注意的地方,例如:  @Override                 public void run() {                     // TODO Auto-generated method stub                     mTimeCount++;                     mProgres
跳槽季,回来后的面试总结。
上周陪同之前一起工作的同事去面试(乔治,小袁,鹏飞(面试人)),第一站是去深圳,第二站上海,第三站杭州。面试什么公司我在这里就不多说了,你们知道是一线公司就行。其实本来真的没打算写这篇文章,主要是自己的记忆力不是很好,再者是最近好多人询问2018年最新的面试题有点多,我实在回答不过来,而且怕为了避免重复回答,给自己省点力气,干脆就在这里统一回复了。说实话,虽作为陪同人,面试的时候我是不可以一同进去...
为什么不建议在广播中启动一个线程做任务
进程生命周期泄漏