android线程的问题 大哥大姐帮帮忙

public class MainActivity extends Activity {

static final String UPPER_NUM="upper";
EditText et;
CalThread calThread;
//定义一个线程类
class CalThread extends Thread{
    public Handler handler;
    public void run(){
        Looper.prepare();
        handler=new Handler(){
            //定义处理消息的方法
            @Override
            public void handleMessage(Message msg){
                if(msg.what==0x123){
                    int upper=msg.getData().getInt(UPPER_NUM);
                    List<Integer> nums=new ArrayList<Integer>();
                    //计算从2开始,到upper的所有质数
                    outer:
                    for(int i=2;i<=upper;i++){
                        //用i除以2开始,到I的平方根的所有数
                        for(int j=2;j<=Math.sqrt(i);j++){
                            //如果可以整出,则表明这个数不是指数
                            if(i!=2 && i%j==0){
                                continue outer;
                            }
                        }
                        nums.add(i);
                    }
                    //使用Toast显示统计出来的所有质数
                    Toast.makeText(MainActivity.this,nums.toString(),Toast.LENGTH_LONG).show();
                }
            }
        };
        Looper.loop();
    }
}
@Override
public void onCreate(Bundle saveInstanceState){
    super.onCreate(saveInstanceState);
    setContentView(R.layout.main);
    et=(EditText) findViewById(R.id.et);
    //启动新线程-----------------------------------------------------111111
             calThread=new CalThread();
    calThread.start();



}
//为按钮的点击事件提供事件处理方法
public void cal(View source){
   //-------------------------------------------------------------------2222222
    //创建消息
    Message msg=new Message();
    msg.what=0x123;
    Bundle bundle=new Bundle();
    bundle.putInt(UPPER_NUM,Integer.parseInt(et.getText().toString()));
    msg.setData(bundle);
    //向新线程中的Handle发送消息
    calThread.handler.sendMessage(msg);  //3333333333333333333333333
}

}

现在这段代码是正确的
如果把1处的线程放在2处启动就出现了异常

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage(android.os.Message)' on a null object reference 提示了3段错了

按逻辑来说不是当按下按钮后才会启动这个线程去运算的吗?

5个回答

 首先,如果你把代码放在按钮里,不点击按钮是不可能会启动线程,也不可能会报错。所以看不懂你说的最后一句话,是说点了按钮报错还是没点按钮报错。
 如果点了按钮报错的话
 等你执行到calThread.handler.sendMessage(msg);这句时,线程早就run玩了,这个线程一点意义都没有
bb520mb
bb520mb 回复danielinbiti: 谢谢 麻烦你了
4 年多之前 回复
danielinbiti
danielinbiti 回复bb520mb: 主线程ui线程一直在运行,没有销毁,和你子线程不一样
4 年多之前 回复
danielinbiti
danielinbiti 回复bb520mb: 你这里本身用线程就是错的,就是一个handler初始化,直接把handler=new Handler(){这段代码放到activity中就行了
4 年多之前 回复
bb520mb
bb520mb 回复danielinbiti: 那请问放在主线程里启动又有什么不同?
4 年多之前 回复
danielinbiti
danielinbiti 回复bb520mb: 也就是说calThread.start();后,就开始执行run方法,等执行calThread.handler.sendMessage(msg)这句话的时候,实际可能存在run方法已经执行完的情况,也就是线程就起到了一个初始化hander的作用,run方法执行完后,线程就自动结束并自我销毁
4 年多之前 回复
bb520mb
bb520mb 请问是不是这个意思,主线程一直都在,但是Button里你点下去瞬间就没了?
4 年多之前 回复
bb520mb
bb520mb 我在主线程里 calThread=new CalThread(); calThread.start(); 不也是一样没执行到calThread.handler.sendMessage(msg) 就run完了吗
4 年多之前 回复
bb520mb
bb520mb 等你执行到calThread.handler.sendMessage(msg);这句时,线程早就run完了 这句话不是很明白
4 年多之前 回复
bb520mb
bb520mb 不好意思没表达清楚 如果不点按钮没报错,如果点了按钮就报错了
4 年多之前 回复

请问是否是考虑同步,要等对象建立完才能去sendMessage啊

是不是因为Android系统默认情况下非主线程中没有开启Looper,如果放在Button里面的话因为没有Looper所以错误,如果要在Button里面启动这个线程的话是不是只要在Button里开启Looper就可以了?

因为线程执行的随机性,对象还没发出,你那里就开始接收数据了,导致访问了空对象,加个空指针判断

bb520mb
bb520mb 加了异常处理 APP没用奔溃了 但是还是没能正常计算 请问怎么做
4 年多之前 回复

等你执行到calThread.handler.sendMessage(msg);这句时,线程早就run完了
这句话不是很明白

立即提问
相关内容推荐