Log cat显示“运行时异常 - 无法在未调用looper.prepare的线程内创建处理程序?我想在固定的时间间隔后通过短信将我的手机的位置更新发送到其他手机。请帮助。建议节省电力的方法也是
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1 = (EditText)findViewById(R.id.editText1);
et2 = (EditText)findViewById(R.id.editText2);
b1 = (Button)findViewById(R.id.button1 );
t1 = new Timer();
t2 = new Timer();
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
listener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
SmsManager sm = SmsManager.getDefault();
String message = String.format(
"New Location \n Longitude: %1$s \n Latitude: %2$s",
location.getLongitude(), location.getLatitude() );
String number = "5556";
sm.sendTextMessage(number,null,message,null,null);
}
};
在每个固定时间间隔后安排请求更新
t1.scheduleAtFixedRate(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, listener,null);
}
},0,300000);
}
}
答案 0 :(得分:1)
从TimerTask文档中不清楚,但我怀疑每个任务都在自己的线程上运行。此外,您正在使用的LocationManager.requestSingleUpdate调用的文档说“如果looper为null,则将在主线程上调用回调”,但我怀疑这是错误的,因为它不同意具有备选方案的那个签名,其中说“如果looper为null,那么将在当前线程上调用回调”。如果后者是正确的,那么这可以解释您的问题,因为您在requestSingleUpdate
主题中调用了TimerTask
,而Looper
主题没有null
。
或许使用getMainLooper而不是requestSingleUpdate
的结果作为{{1}}的最后一个参数。
答案 1 :(得分:0)