android中google“定位查询”编辑
16lz
2021-01-26
“定位查询”locate()方法,增加一个线程,在该线程中处理查询地点的功能,请参考代码清单16-10,完整代码请参考chapter16_7工程中src/com/work/map/MyMapActivity.java文件locate()方法代码部分。
【代码清单16-1】
/** * 定位查询 */private void locate() { LayoutInflater factory= LayoutInflater.from(MyMapActivity.this); View locationView =factory.inflate(R.layout.find_dialog, null); final EditTextfindText = (EditText) locationView .findViewById(R.id.dailog_find); newAlertDialog.Builder(this).setTitle(R.string.dialog_find).setView( locationView).setPositiveButton(R.string.button_ok, newDialogInterface.OnClickListener() { public void onClick(DialogInterfacedialog, int whichButton) { findString= findText.getText().toString(); progDialog =ProgressDialog.show(MyMapActivity.this, "处理中...", "定位" +findString, true, false); new Thread() { @Override publicvoid run() { try{ Geocoder geocoder = new Geocoder( MyMapActivity.this); addresses =geocoder.getFromLocationName( findString, 1); if (addresses.size() > 0) { List<OverlayItem>overlayitems = new ArrayList<OverlayItem>(); doublelat = addresses.get(0) .getLatitude(); doublelng = addresses.get(0) .getLongitude(); //设定中心点 centerPoit= new GeoPoint( (int)(lat * 1E6), (int)(lng * 1E6)); // 地理坐标 mc.setCenter(centerPoit); Log.i(TAG," lat " + lat + " lng" +lng); intintMaxAddressLineIndex = addresses .get(0) .getMaxAddressLineIndex(); Stringaddress = "地址:"; for(int j = 0; j <= intMaxAddressLineIndex; j++) { if (addresses.get(0) == null) continue; address += addresses.get(0) .getAddressLine(j) + ","; } if(address.endsWith(",")) { address = address.substring(0, address.length() - 1); } Stringtitle = ""; if(addresses.get(0).getFeatureName() == null) { title = ""; }else { title = addresses.get(0) .getFeatureName(); } overlayitems.add(newOverlayItem( centerPoit,title, address)); Drawablemarker = getResources() .getDrawable( R.drawable.markermap2); locs= new LocationItemsOverlay(marker, overlayitems); handler.sendEmptyMessage(0); } else { handler.sendEmptyMessage(1); } }catch (Exception e) { e.printStackTrace(); handler.sendEmptyMessage(1); } } }.start(); } }).setNegativeButton(R.string.button_cancel, newDialogInterface.OnClickListener() { public void onClick(DialogInterfacedialog, int which) { } }).show();}
通过下面的代码是实现显示进度条:
progDialog =ProgressDialog.show(MyMapActivity.this, "处理中...", "定位" + findString, true, false);
启动一个子线程,在该线程中实现地点查询,但是不能有更新UI的处理,如果查询成功调用handler.sendEmptyMessage(0),如果失败调用handler.sendEmptyMessage(1)。
new Thread() {
@Override
public void run() {
… …
}
}.start();
在Hander的handleMessage方法中处理更新UI操作,其中成功(case 0)时候清除屏幕上原来的图层,重新添加图层,最后progDialog.dismiss()方法关闭进度条对话框。如果是查询失败(case 1)弹出Toast说明一下,也要通过progDialog.dismiss()方法关闭进度条对话框,否则进度条对话框不会关闭。
private Handler handler = new Handler() { @Override public voidhandleMessage(Message msg) { switch (msg.what) { case 0: mapView.getOverlays().clear(); mapView.getOverlays().add(locs); progDialog.dismiss(); break; case 1: Toast.makeText(MyMapActivity.this,"暂时无法" + findString + "信息。", Toast.LENGTH_SHORT).show(); progDialog.dismiss(); } }};
出自《Android开发案例驱动教程》第十六章
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- android CountDownTimer
- Android(安卓)AsyncTask源码解析
- Android(安卓)JS交互与JS代码注入--详解
- [转]Android(安卓)Test Auto Test Mu…
- 在Eclipse中查看android 源代码的方法!
- 录音函数网络对讲机C#服务器 Android客户端(二) C#服务器代码分析
- 代码方法android全屏显示
- android对文件的MD5验证