編輯:關於android開發
在這裡,本人主要想做一個
1、首先從網上獲取數據
2、將獲取的數據存儲到本地
3、地圖上顯示屏幕范圍內的marker。
4、當地圖狀態改變時,要查詢本地數據庫,並更新地圖。
BaiduMap有個setOnMapStatusChangeListener監聽類,該類監聽BaiduMap的狀態,共有三個方法——onMapStatusChangeStart(),onMapStatusChangeFinish(),onMapStatusChange()。
void onMapStatusChangeStart(MapStatus status)
手勢操作地圖,設置地圖狀態等操作導致地圖狀態開始改變。
參數:
status - 地圖狀態改變開始時的地圖狀態
void onMapStatusChange(MapStatus status)
地圖狀態變化中
參數:
status - 當前地圖狀態
void onMapStatusChangeFinish(MapStatus status)
地圖狀態改變結束
參數:
status - 地圖狀態改變結束後的地圖狀態
若BaiduMap狀態改變,就會調用相應的函數。
其實這裡有個笨方法,那就是每次地圖狀態改變,就從服務器獲取數據,然後更新到地圖上,但這樣每次都要聯網從服務器端獲取數據,而且每次都要調用子線程,非常耗時間和內存,所以,本人想直接一次從服務器端獲取數據,然後存在本地,每次地圖狀態改變時直接從本地獲取數據然後更新到地圖上,這樣就會節約時間與內存。
但,子線程中從網絡上獲取的數據,怎麼傳給主線程呢?其實異步線程中有個方法很好實現這點。我們先來簡單介紹一下異步線程的用法。
AsyncTask定義了三種泛型類型 Params,Progress和Result。
Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
Progress 後台任務執行的百分比。
Result 後台執行任務最終返回的結果,比如String。
AsyncTask定義了幾個方法
1、doInBackground(Params…) 後台執行,比較耗時的操作都可以放在這裡。注意這裡不能直接操作UI。此方法在後台線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress…)來更新任務的進度。
2、onPostExecute(Result) 相當於Handler 處理UI的方式,在這裡面可以使用在doInBackground 得到的結果處理操作UI。 此方法在主線程執行,任務執行的結果作為此方法的參數返回,本例中關鍵是這個方法。
3、有必要的話你還得重寫以下這三個方法,但不是必須的:
onProgressUpdate(Progress…) 可以使用進度條增加用戶體驗度。 此方法在主線程執 行,用於顯示任務執行的進度。
onPreExecute() 這裡是最終用戶調用Excute時的接口,當任務執行之前開始調用此方法,可以在這裡顯示進度對話框。
onCancelled() 用戶調用取消時,要做的操作
4、使用AsyncTask類,以下是幾條必須遵守的准則:
Task的實例必須在UI thread中創建;
execute方法必須在UI thread中調用;
不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法;
該task只能被執行一次,否則多次調用時將會出現異常;
接下來,我們看看我想寫的效果吧:
package com.yds.newpowerbike.fragment;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.Fragment;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.CircleOptions;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.DistanceUtil;
import com.yds.newpowerbike.R;
import com.yds.newpowerbike.bean.PolePoint;
import com.yds.newpowerbike.db.DBManager;
import com.yds.newpowerbike.net.ConnectServerIml;
import com.yds.newpowerbike.net.ShareData;
import com.yds.newpowerbike.util.JsonParse;
public class HomeFragment extends Fragment {
private Activity activity;
private MapView mMapView;
public MyLocationListener myListener = new MyLocationListener();
private DBManager mgr;
BaiduMap mBaiduMap;
LocationClient mLocClient;
boolean isFirstLoc = true;
boolean isLocationClientStop = false;
ConnectServerIml iml;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreateView(inflater, container, savedInstanceState);
this.activity = getActivity();
SDKInitializer.initialize(activity.getApplicationContext());
return inflater.inflate(R.layout.fragment_home, container,false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
mMapView = (MapView) activity.findViewById(R.id.mapview);
mBaiduMap = mMapView.getMap();
mBaiduMap.setMyLocationEnabled(true);
//數據庫操作——實例化DBManager
mgr = new DBManager(activity);
mLocClient = new LocationClient(activity);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setCoorType("bd09ll");//bd09LL
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
asyncTask task = new asyncTask();
task.execute();
}
class asyncTask extends AsyncTask{
@Override
protected DBManager doInBackground(LatLng... params) {
// TODO Auto-generated method stub
//充電樁服務器查詢
iml = new ConnectServerIml();
String url = ShareData.CHARGE_SEARCH;
String result = iml.ConcernByClientGet(url);
//json數據解析
ArrayList list = JsonParse.search(result);
//數據庫操作——插入數據
mgr.add(list);
return mgr;
}
@Override
protected void onPostExecute(final DBManager mgr) {
// TODO Auto-generated method stub
super.onPostExecute(mgr);
final Listlist = mgr.query();
mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
//地圖狀態改變前
Marker marker;
int length = list.size();
@Override
public void onMapStatusChangeStart(MapStatus status) {
// TODO Auto-generated method stub
}
//地圖狀態改變後
@Override
public void onMapStatusChangeFinish(MapStatus status) {
// TODO Auto-generated method stub
LatLng mCenter = status.target;
//數據庫操作——數據查詢
for (int i = 0; i < length; i++) {
String pt = list.get(i).PoleFix;
double lat = iml.getLat(pt);
double lng = iml.getLng(pt);
//marker的經緯度
LatLng pt_ll = new LatLng(lat, lng);
//獲得marker與圓中心點之間的距離。
double distance = DistanceUtil.getDistance(pt_ll, mCenter);
//圓的半徑是8000,這裡為美觀取7600,距離小於7600的顯示
if(distance<7600){
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
OverlayOptions options = new MarkerOptions()
.position(pt_ll)
.icon(bitmap)
.zIndex(14)
.draggable(true);
marker = (Marker) mBaiduMap.addOverlay(options);
}
}
}
//地圖狀態改變時
@Override
public void onMapStatusChange(MapStatus status) {
// TODO Auto-generated method stub
LatLng mCenter = status.target;
mBaiduMap.clear();
//畫圓
OverlayOptions ooCircle = new CircleOptions().fillColor(0x384d73b3)
.center(mCenter).stroke(new Stroke(3, 0x784d73b3))
.radius(8000);
mBaiduMap.addOverlay(ooCircle);
// for (int i = 0; i < length; i++) {
// String pt = list.get(i).PoleFix;
// double lat = iml.getLat(pt);
// double lng = iml.getLng(pt);
// //marker的經緯度
// LatLng pt_ll = new LatLng(lat, lng);
// //獲得marker與圓中心點之間的距離。
// double distance = DistanceUtil.getDistance(pt_ll, mCenter);
// //圓的半徑是8000,這裡為美觀取7600,距離小於7600的顯示
// if(distance<7600){
// BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
// OverlayOptions options = new MarkerOptions()
// .position(pt_ll)
// .icon(bitmap)
// .zIndex(14)
// .draggable(true);
//
// marker = (Marker) mBaiduMap.addOverlay(options);
//
// }
// }
}
});
}
}
public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
if(location == null||isLocationClientStop)
return;
//定位相關數據
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(locData);
if(isFirstLoc){
isFirstLoc = false;
//定位點坐標
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
//設置地圖中心點和縮放級別
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 12);
//以動畫方式更新地圖狀態,動畫耗時 300 ms
mBaiduMap.animateMapStatus(u);
//畫圓
OverlayOptions ooCircle = new CircleOptions().fillColor(0x384d73b3)
.center(ll).stroke(new Stroke(3, 0x784d73b3))
.radius(8000);
mBaiduMap.addOverlay(ooCircle);
}
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
// mLocClient.stop();
// mBaiduMap.setMyLocationEnabled(false);
// mMapView = null;
//關閉數據庫
mgr.closeDB();
mMapView.onDestroy();
super.onDestroy();
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
mMapView.onPause();
}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
mMapView.onResume();
}
}
這裡有地圖定位,地圖畫圓,顯示圓范圍內的marker,還有Fragment,這些在我前面的博客中可以看到,這裡就不詳細講了。
DBHelper類中:
package com.yds.newpowerbike.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "pole.db";
private static final int DATABASE_VERSION = 1;
public DBHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//創建表
db.execSQL("create table if not exists polepoint"+
"(_id integer primary key autoincrement,poleid varchar,poleaddress varchar,polename varchar,polefix varchar,userid varchar)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
//更新表
db.execSQL("ALTER TABLE polepoint ADD COLUMN other STRING");
}
}
DBManager類中
package com.yds.newpowerbike.db;
import java.util.ArrayList;
import java.util.List;
import com.yds.newpowerbike.bean.PolePoint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class DBManager {
private DBHelper helper;
private SQLiteDatabase db;
public DBManager(Context context){
helper = new DBHelper(context);
db = helper.getWritableDatabase();
}
public void add(List list){
db.beginTransaction();
try {
for (PolePoint pp:list) {
db.execSQL("insert into polepoint values(null,?,?,?,?,?)",new Object[]{pp.PoleId,pp.PoleAdress,pp.PoleName,pp.PoleFix,pp.UserId});
}
db.setTransactionSuccessful();
} catch (Exception e) {
// TODO: handle exception
}finally{
db.endTransaction();
}
}
// public void updatePoleAdress(PolePoint pp){
// ContentValues cv = new ContentValues();
// cv.put("PoleAdress", pp.PoleAdress);
// db.update("polepoint", cv, "polename = ?", new String[]{pp.PoleName});
// }
public List query(){
ArrayListlist = new ArrayList();
Cursor c = queryTheCursor();
while (c.moveToNext()) {
PolePoint pp = new PolePoint();
pp.PoleId = c.getString(c.getColumnIndex("poleid"));
pp.PoleAdress = c.getString(c.getColumnIndex("poleaddress"));
pp.PoleName = c.getString(c.getColumnIndex("polename"));
pp.PoleFix = c.getString(c.getColumnIndex("polefix"));
pp.UserId = c.getString(c.getColumnIndex("userid"));
list.add(pp);
}
//關閉游標
c.close();
return list;
}
public Cursor queryTheCursor(){
Cursor c = db.rawQuery("select * from polepoint", null);
return c;
}
public void closeDB(){
db.close();
}
// public void deleteOldPerson(PolePoint pp){
// db.delete("polepoint", "age>=?", new String[]{String.valueOf(person.age)});
//
// }
}
PolePoint類中
package com.yds.newpowerbike.bean;
import java.io.Serializable;
/**
* {
"PoleId": "003f3745-2032-4fa9-afe5-97afde42a89f",
"PoleAdress": "鏋附璺?97闄勮繎",
"PoleState": 0,
"PoleStyle": 0,
"PoleFix": "30.884728,121.01502099999999",
"PoleName": "鐢靛姩姹借濺鍏呯數妗?",
"UserId": "null"
},
* @author Administrator
* @description 鍏呯數妗╅噷闈㈢殑鐐?
*/
public class PolePoint implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
public int _id;
public String PoleId;
public String PoleAdress;
public String PoleState;
public String PoleStyle;
public String PoleFix;
public String PoleName;
public String UserId;
public PolePoint(){
}
public PolePoint(String poleId,String poleAddress,String poleName,String poleFix,String userId){
this.PoleId = poleId;
this.PoleAdress = poleAddress;
this.PoleName = poleName;
this.PoleFix = poleFix;
this.UserId = userId;
}
public String getPoleId() {
return PoleId;
}
public void setPoleId(String poleId) {
PoleId = poleId;
}
public String getPoleAdress() {
return PoleAdress;
}
public void setPoleAdress(String poleAdress) {
PoleAdress = poleAdress;
}
public String getPoleState() {
return PoleState;
}
public void setPoleState(String poleState) {
PoleState = poleState;
}
public String getPoleStyle() {
return PoleStyle;
}
public void setPoleStyle(String poleStyle) {
PoleStyle = poleStyle;
}
public String getPoleFix() {
return PoleFix;
}
public void setPoleFix(String poleFix) {
PoleFix = poleFix;
}
public String getPoleName() {
return PoleName;
}
public void setPoleName(String poleName) {
PoleName = poleName;
}
public String getUserId() {
return UserId;
}
public void setUserId(String userId) {
UserId = userId;
}
}
Android安卓破解之逆向分析SO常用的IDA分析技巧 1、結構體的創建及導入,結構體指針等。 以JniNativeInterface, DexHeader為例。 解析
Unity+高通Vuforia SDK——AR播放視頻 在之前的文章中我們已經實現了基本的圖片識別,並在識別的圖片上顯示3D模型,但是有的時候我們實際上需要在
Android系統 應用圖標顯示未讀消息數(BadgeNumber) 桌面app圖標的角標顯示 Android系統 小米,三星,索尼手機發送桌面快鍵提醒數字圖標,在
Android基礎入門教程——10.10 傳感器專題(1)——相關介紹 Android基礎入門教程——10.10 傳感器專題(1)—&