使用Android GPS的盆友,想必对GetLastKnownLocation一定不陌生吧,这个空指针错误应该或多或少的会折磨折磨初来的人。网上有许多的解决办法,最多的就是那个从国外论坛上学来的方法。mgr.requestLocationUpdates("gps", 60000, 1, locationListener); 大概就是这个意思啦,大家可以网上搜一下,我就不重复了,或许是因为我太菜了,居然没成功,但是通过自己的思考,自己设计了一种处理这个空指针错误的方法,权是抛砖引玉,呵呵。
GPS的两个问题:
1:GetLastKnownLocation返回null
2:requestLocationUpdates出现FC。
解决办法:
- 对于第一个问题。maploc=mapSer.getLastKnownLocation(provider);如果maploc返回null,那么随后updateWithNewLocation(maploc);如果不对maploc进行处理肯定是会出错的,处理很简单:if(location==null) return;也可以加上一句toast。
- 第二个问题是这样的。如果mapSer.requestLocationUpdates(provider,5000,5,locationListener);持续向provider监听,而provider无法返回位置的话。那么如果不加任何处理,长时间无法获取位置,就会出现FC问题。这个时间大概是30秒左右?怎么解决呢,我是采用java的计时器来解决的。通过计时器设定搜寻时间,控制搜寻时间小于会出现FC错误的时间。当搜寻时间超过设定后,触发计时任务,即取消监听。那么就不会触发FC啦。需要注意的是计时器需要运行在其他线程,用handler就可以啦,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
//第一次打开程序,需要重新定位。
if (first) { toast(2); //计时器来控制定位时间,阈值为10秒。 mytimer.schedule( new
TimerTask(){ public
void run() { Message message =
new Message();
message.what = 1;
handler.sendMessage(message);}},10*1000);
}
|
hundler代码如下:
1
2
3
4
5
6
7
8
9
10
|
final
Handler handler = new
Handler(){ public
void handleMessage(Message msg) {
switch
(msg.what) { case
1 : toast( 3 ); break ;
}
super .handleMessage(msg);
}
};
|
toast代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private
void toast( int
i) { switch (i) { case
1 : //或许无效 Toast.makeText( this ,
"暂时无法更新位置,请稍候" , Toast.LENGTH_SHORT).show(); return ; case
2 : //手机重启后或者第一次使用 Toast.makeText( this ,
"正在定位,请稍候" , Toast.LENGTH_SHORT).show(); return ; case
3 : //无法定位 Toast.makeText( this ,
"无法定位,请稍候重试" , Toast.LENGTH_SHORT).show(); mapSer.removeUpdates(locationListener); return ; } } |
写的不是很清楚,如果需要源码的话可以联系我,有问题大家也可以一起讨论。O(∩_∩)O~