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段错了
按逻辑来说不是当按下按钮后才会启动这个线程去运算的吗?
首先,如果你把代码放在按钮里,不点击按钮是不可能会启动线程,也不可能会报错。所以看不懂你说的最后一句话,是说点了按钮报错还是没点按钮报错。
如果点了按钮报错的话
等你执行到calThread.handler.sendMessage(msg);这句时,线程早就run玩了,这个线程一点意义都没有
请问是否是考虑同步,要等对象建立完才能去sendMessage啊
是不是因为Android系统默认情况下非主线程中没有开启Looper,如果放在Button里面的话因为没有Looper所以错误,如果要在Button里面启动这个线程的话是不是只要在Button里开启Looper就可以了?
因为线程执行的随机性,对象还没发出,你那里就开始接收数据了,导致访问了空对象,加个空指针判断
等你执行到calThread.handler.sendMessage(msg);这句时,线程早就run完了
这句话不是很明白
你再做一个启动线程的按钮,先按下启动线程按钮,再按下发送message的按钮,看看会不会报错