Java 线程和循环.prepare()问题
我不能让它工作。 问题是,从未通知线程侦听器已完成位置搜索Java 线程和循环.prepare()问题,java,android,progress-bar,Java,Android,Progress Bar,我不能让它工作。 问题是,从未通知线程侦听器已完成位置搜索 final ProgressDialog progress = new ProgressDialog(this); progress.setTitle("Procurando"); progress.setMessage("Localizando o dispositivo."); progress.show(); Thread thread = new Thread(new Runnable() {
final ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("Procurando");
progress.setMessage("Localizando o dispositivo.");
progress.show();
Thread thread = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
GeoLocationHandler handler = new GeoLocationHandler();
try {
synchronized (handler) {
Looper.prepare();
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,handler);
handler.wait();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
progress.dismiss();
mLocationManager.removeUpdates(handler);
double lat = mLocation.getLatitude();
double lng = mLocation.getLongitude();
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("http://maps.google.com/maps?saddr=" + lat + "," + lng + "&daddr=-22.858114, -43.231295"));
startActivity(intent);
}
}
thread.start();
下面是实现LocationListener的类:
private class GeoLocationHandler implements LocationListener {
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
mLocation = location;
notify();
}
}
找到了解决办法,不是我想要的那样安静,但它是有效的。 将“进度”对话框创建为字段,并通过处理程序将其取消
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.ibMap:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle("Procurando");
mProgressDialog.setMessage("Localizando o dispositivo.");
mProgressDialog.show();
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mGeoHandler);
break;
default:
Toast.makeText(getBaseContext(), "Nothing yet.", Toast.LENGTH_SHORT).show();
}
}
private class GeoLocationHandler implements LocationListener {
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
mLocation = location;
mHandler.sendEmptyMessage(0);
}
}
private class MyHandler extends Handler {
@Override
public void dispatchMessage(Message msg) {
mProgressDialog.dismiss();
double lat = mLocation.getLatitude();
double lng = mLocation.getLongitude();
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?saddr=" + lat + "," + lng + "&daddr=UFRJ,RJ"));
startActivity(intent);
super.dispatchMessage(msg);
}
}
问题是您没有从同步块调用
notify()
。如果您想尝试使原始解决方案正常工作,请尝试以下方法
private class GeoLocationHandler implements LocationListener {
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
mLocation = location;
synchronized(handler){
notify();
}
}
}
你从哪里开始这个线程。Bharat Sharma,刚刚编辑了我的问题并添加了thread.start(),在我创建完run方法后,它就正常了。谢谢你的回答。Bharat Sharma,刚刚编辑了我的问题并添加了thread.start(),在我完成run方法的创建之后就可以了。谢谢你的回答。谢谢您的回答。如果您已经解决了问题,请删除此问题或标记答案,否则会有人标记为无效。但问题尚未解决。请改为在“this”上同步,因为您没有对“handler”的引用。我还建议使用
notifyAll()
而不是notify()
@Nate,如果您没有对处理程序的引用,但是您需要在调用wait/notify on的同一个监视器上进行同步,否则您将得到相同的结果。最终,OP需要在这个
或处理程序
引用上同步,但两次都需要相同的东西