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需要在
这个
处理程序
引用上同步,但两次都需要相同的东西