也议GetLastKnownLocation!!(独家理解)

本文针对Android应用中使用GPS定位时出现的GetLastKnownLocation返回null及requestLocationUpdates导致的FC问题提供了解决方案。通过判断返回值是否为空避免空指针异常,并利用计时器控制定位超时,有效防止应用程序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      使用Android GPS的盆友,想必对GetLastKnownLocation一定不陌生吧,这个空指针错误应该或多或少的会折磨折磨初来的人。网上有许多的解决办法,最多的就是那个从国外论坛上学来的方法。mgr.requestLocationUpdates("gps", 60000, 1, locationListener); 大概就是这个意思啦,大家可以网上搜一下,我就不重复了,或许是因为我太菜了,居然没成功,但是通过自己的思考,自己设计了一种处理这个空指针错误的方法,权是抛砖引玉,呵呵。

GPS的两个问题:

1:GetLastKnownLocation返回null

2:requestLocationUpdates出现FC。

解决办法:

  1. 对于第一个问题。maploc=mapSer.getLastKnownLocation(provider);如果maploc返回null,那么随后updateWithNewLocation(maploc);如果不对maploc进行处理肯定是会出错的,处理很简单:if(location==null)  return;也可以加上一句toast。
  2. 第二个问题是这样的。如果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~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值