前言
回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。公司开始第二波裁员,我决定主动拿赔偿走人。后续的面试过程我做了一些准备,基本都能走到hr面,后面我也顺利地拿到了offer,我给大家分享下我的求职体会,希望能给大家一些参考。
-
import java.util.concurrent.Executors;
-
import android.app.Service;
-
import android.content.Intent;
-
import android.os.IBinder;
-
import app.db.DistanceInfoDao;
-
import app.model.GpsLocation;
-
import app.model.DistanceInfo;
-
import app.ui.MyApplication;
-
import app.utils.BDLocation2GpsUtil;
-
import app.utils.FileUtils;
-
import app.utils.LogUtil;
-
import com.baidu.location.BDLocation;
-
import com.baidu.location.BDLocationListener;
-
import com.baidu.location.LocationClient;
-
import com.baidu.location.LocationClientOption;
-
import com.computedistance.DistanceComputeInterface;
-
import com.computedistance.impl.DistanceComputeImpl;
-
public class LocationService extends Service {
-
public static final String FILE_NAME = “log.txt”; //日志
-
LocationClient mLocClient;
-
private Object lock = new Object();
-
private volatile GpsLocation prevGpsLocation = new GpsLocation(); //定位数据
-
private volatile GpsLocation currentGpsLocation = new GpsLocation();
-
private MyLocationListenner myListener = new MyLocationListenner();
-
private volatile int discard = 1; //Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。
-
private DistanceInfoDao mDistanceInfoDao;
-
private ExecutorService executor = Executors.newSingleThreadExecutor();
-
@Override
-
public IBinder onBind(Intent intent) {
-
return null;
-
}
-
@Override
-
public void onCreate() {
-
super.onCreate();
-
mDistanceInfoDao = new DistanceInfoDao(this); //初始化数据库
-
//LogUtil.info(LocationService.class, “Thread id ----------->:” + Thread.currentThread().getId());
-
mLocClient = new LocationClient(this);
-
mLocClient.registerLocationListener(myListener);
-
//定位参数设置
-
LocationClientOption option = new LocationClientOption();
-
option.setCoorType(“bd09ll”); //返回的定位结果是百度经纬度,默认值gcj02
-
option.setAddrType(“all”); //返回的定位结果包含地址信息
-
option.setScanSpan(5000); //设置发起定位请求的间隔时间为5000ms
-
option.disableCache(true); //禁止启用缓存定位
-
option.setProdName(“app.ui.activity”);
-
option.setOpenGps(true);
-
option.setPriority(LocationClientOption.GpsFirst); //设置GPS优先
-
mLocClient.setLocOption(option);
-
mLocClient.start();
-
mLocClient.requestLocation();
-
}
-
@Override
-
@Deprecated
-
public void onStart(Intent intent, int startId) {
-
super.onStart(intent, startId);
-
}
-
@Override
-
public void onDestroy() {
-
super.onDestroy();
-
if (null != mLocClient) {
-
mLocClient.stop();
-
}
-
startService(new Intent(this, LocationService.class));
-
}
-
private class Task implements Callable{
-
private BDLocation location;
-
public Task(BDLocation location){
-
this.location = location;
-
}
-
/**
-
* 检测是否在原地不动
-
*
-
* @param distance
-
* @return
-
*/
-
private boolean noMove(float distance){
-
if (distance < 0.01) {
-
return true;
-
}
-
return false;
-
}
-
/**
-
* 检测是否在正确的移动
-
*
-
* @param distance
-
* @return
-
*/
-
private boolean checkProperMove(float distance){
-
if(distance <= 0.1 * discard){
-
return true;
-
}else{
-
return false;
-
}
-
}
-
/**
-
* 检测获取的数据是否是正常的
-
*
-
* @param location
-
* @return
-
*/
-
private boolean checkProperLocation(BDLocation location){
-
if (location != null && location.getLatitude() != 0 && location.getLongitude() != 0){
-
return true;
-
}
-
return false;
-
}
-
@Override
-
public String call() throws Exception {
-
synchronized (lock) {
-
if (!checkProperLocation(location)){
-
LogUtil.info(LocationService.class, “location data is null”);
-
discard++;
-
return null;
-
}
-
if (MyApplication.orderDealInfoId != -1) {
-
DistanceInfo mDistanceInfo = mDistanceInfoDao.getById(MyApplication.orderDealInfoId); //根据MainActivity中赋值的全局id查询数据库的值
-
if(mDistanceInfo != null) //不为空则说明车已经开始行使,并可以获得经纬度,计算移动距离
-
{
-
LogUtil.info(LocationService.class, “行驶中…”);
-
GpsLocation tempGpsLocation = BDLocation2GpsUtil.convertWithBaiduAPI(location); //位置转换
-
if (tempGpsLocation != null) {
-
currentGpsLocation = tempGpsLocation;
-
}else{
-
discard ++;
-
}
-
//日志
-
String logMsg = “(plat:—>” + prevGpsLocation.lat + " plgt:—>" + prevGpsLocation.lng +“)\n” +
-
“(clat:—>” + currentGpsLocation.lat + " clgt:—>" + currentGpsLocation.lng + “)”;
-
LogUtil.info(LocationService.class, logMsg);
-
/** 计算距离 */
-
float distance = 0.0f;
-
DistanceComputeInterface distanceComputeInterface = DistanceComputeImpl.getInstance(); //计算距离类对象
-
distance = (float) distanceComputeInterface.getLongDistance(prevGpsLocation.lat,prevGpsLocation.lng,
-
currentGpsLocation.lat,currentGpsLocation.lng); //移动距离计算
-
if (!noMove(distance)) { //是否在移动
-
if (checkProperMove(distance)) { //合理的移动
-
float drivedDistance = mDistanceInfo.getDistance();
-
mDistanceInfo.setDistance(distance + drivedDistance); //拿到数据库原始距离值, 加上当前值
-
mDistanceInfo.setLongitude(currentGpsLocation.lng); //经度
-
mDistanceInfo.setLatitude(currentGpsLocation.lat); //纬度
-
//日志记录
-
FileUtils.saveToSDCard(FILE_NAME,“移动距离—>:”+distance+drivedDistance+“\n”+“数据库中保存的距离”+mDistanceInfo.getDistance());
-
mDistanceInfoDao.updateDistance(mDistanceInfo);
-
discard = 1;
-
}
-
}
-
prevGpsLocation = currentGpsLocation;
-
}
-
}
-
return null;
-
}
-
}
-
}
-
/**
-
* 定位SDK监听函数
-
*/
-
public class MyLocationListenner implements BDLocationListener {
-
@Override
-
public void onReceiveLocation(BDLocation location) {
-
executor.submit(new Task(location));
-
LogUtil.info(LocationService.class, “经度:”+location.getLongitude());
-
LogUtil.info(LocationService.class, “纬度:”+location.getLatitude());
-
//将经纬度保存于全局变量,在MainActivity中点击按钮时初始化数据库字段
-
if(MyApplication.lng <=0 && MyApplication.lat <= 0)
-
{
-
MyApplication.lng = location.getLongitude();
-
MyApplication.lat = location.getLatitude();
-
}
-
}
-
public void onReceivePoi(BDLocation poiLocation) {
-
if (poiLocation == null){
-
return ;
-
}
-
}
-
}
-
}
以下是应用中需要使用的DBOpenHelper数据库类 DBOpenHelper.java
[java] [view plain](() [copy](() [print](() [?](() [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLeD1lFO-1649750533997)(https://code.youkuaiyun.com/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zibunNDe-1649750533998)(https://code.youkuaiyun.com/assets/ico_fork.svg)]
-
package app.db;
-
import android.content.Context;
-
import android.database.sqlite.SQLiteDatabase;
-
import android.database.sqlite.SQLiteOpenHelper;
-
public class DBOpenHelper extends SQLiteOpenHelper{
-
private static final int VERSION = 1; //数据库版本号
-
private static final String DB_NAME = “distance.db”; //数据库名
-
public DBOpenHelper(Context context){ //创建数据库
-
super(context, DB_NAME, null, VERSION);
-
}
-
@Override
-
public void onCreate(SQLiteDatabase db) { //创建数据表
-
db.execSQL(“CREATE TABLE IF NOT EXISTS milestone(id INTEGER PRIMARY KEY AUTOINCREMENT, distance INTEGER,longitude DOUBLE, latitude DOUBLE )”);
-
}
-
@Override
-
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //版本号发生改变的时
-
db.execSQL(“drop table milestone”);
-
db.execSQL(“CREATE TABLE IF NOT EXISTS milestone(id INTEGER PRIMARY KEY AUTOINCREMENT, distance INTEGER,longitude FLOAT, latitude FLOAT )”);
-
}
-
}
以下是应用中需要使用的数据库业务逻辑封装类 DistanceInfoDao.java
[java] [view plain](() [copy](() [print](() [?](() [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C1FZTG5p-1649750533998)(https://code.youkuaiyun.com/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8IHzXaSM-1649750533999)(https://code.youkuaiyun.com/assets/ico_fork.svg)]
-
package app.db;
-
import android.content.Context;
-
import android.database.Cursor;
-
import android.database.sqlite.SQLiteDatabase;
-
import app.model.DistanceInfo;
-
import app.utils.LogUtil;
-
public class DistanceInfoDao {
-
private DBOpenHelper helper;
-
private SQLiteDatabase db;
-
public DistanceInfoDao(Context context) {
-
helper = new DBOpenHelper(context);
-
}
-
public void insert(DistanceInfo mDistanceInfo) {
-
if (mDistanceInfo == null) {
-
return;
-
}
-
db = helper.getWritableDatabase();
-
String sql = “INSERT INTO milestone(distance,longitude,latitude) VALUES('”+ mDistanceInfo.getDistance() + “‘,’”+ mDistanceInfo.getLongitude() + “‘,’”+ mDistanceInfo.getLatitude() + “')”;
-
LogUtil.info(DistanceInfoDao.class, sql);
-
db.execSQL(sql);
-
db.close();
-
}
-
public int getMaxId() {
-
db = helper.getReadableDatabase();
-
Cursor cursor = db.rawQuery(“SELECT MAX(id) as id from milestone”,null);
-
if (cursor.moveToFirst()) {
-
return cursor.getInt(cursor.getColumnIndex(“id”));
-
}
-
return -1;
-
}
-
/**
-
* 添加数据
-
* @param orderDealInfo
-
* @return
-
*/
-
public synchronized int insertAndGet(DistanceInfo mDistanceInfo) {
-
int result = -1;
-
insert(mDistanceInfo);
-
result = getMaxId();
-
return result;
-
}
-
/**
-
* 根据id获取
-
* @param id
-
* @return
-
*/
-
public DistanceInfo getById(int id) {
-
db = helper.getReadableDatabase();
-
Cursor cursor = db.rawQuery(“SELECT * from milestone WHERE id = ?”,new String[] { String.valueOf(id) });
-
DistanceInfo mDistanceInfo = null;
-
if (cursor.moveToFirst()) {
-
mDistanceInfo = new DistanceInfo();
-
mDistanceInfo.setId(cursor.getInt(cursor.getColumnIndex(“id”)));
-
mDistanceInfo.setDistance(cursor.getFloat(cursor.getColumnIndex(“distance”)));
-
mDistanceInfo.setLongitude(cursor.getFloat(cursor.getColumnIndex(“longitude”)));
-
mDistanceInfo.setLatitude(cursor.getFloat(cursor.getColumnIndex(“latitude”)));
-
}
-
cursor.close();
-
db.close();
-
return mDistanceInfo;
-
}
-
/**
-
* 更新距离
-
* @param orderDealInfo
-
*/
-
public void updateDistance(DistanceInfo mDistanceInfo) {
-
if (mDistanceInfo == null) {
-
return;
-
}
-
db = helper.getWritableDatabase();
-
String sql = “update milestone set distance=”+ mDistanceInfo.getDistance() +“,longitude=”+mDistanceInfo.getLongitude()+“,latitude=”+mDistanceInfo.getLatitude()+" where id = "+ mDistanceInfo.getId();
-
LogUtil.info(DistanceInfoDao.class, sql);
-
db.execSQL(sql);
-
db.close();
-
}
-
}
以下是需要使用到的实体类 DistanceInfo.java (set数据到对应变量,以实体类作为参数更新数据库)
[java] [view plain](() [copy](() [print](() [?](() [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3oBu6AMv-1649750534000)(https://code.youkuaiyun.com/assets/CODE_ico.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PjJa8XaG-1649750534000)(https://code.youkuaiyun.com/assets/ico_fork.svg)]
-
package app.model;
-
public class DistanceInfo {
-
private int id;
-
private float distance;
-
private double longitude;
-
private double latitude;
-
public int getId() {
-
return id;
-
}
-
public void setId(int id) {
文末
那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。
Android希望=技能+面试
- 技能
- 面试技巧+面试题
-
package app.model;
-
public class DistanceInfo {
-
private int id;
-
private float distance;
-
private double longitude;
-
private double latitude;
-
public int getId() {
-
return id;
-
}
-
public void setId(int id) {
文末
那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。
Android希望=技能+面试
- 技能
[外链图片转存中…(img-H1HMayKi-1649750534001)] - 面试技巧+面试题
[外链图片转存中…(img-fVEH4lCC-1649750534001)]
Android开发不会这些?如何面试拿高薪!