【问题标题】:Why application stops for some time and button also not pushed为什么应用程序停止一段时间并且按钮也没有按下
【发布时间】:2019-09-26 19:31:14
【问题描述】:

这是我的程序的要点。当我按下用于告诉位置的按钮时,如果地理编码器没有抛出任何异常,它工作正常,但是当地理编码器抛出异常并且同时我的应用程序停止一些时,问题就出现了时间就像它挂起一样。

因为进度条停止旋转,也没有按下停止按钮。但是在 30 秒或 1 分钟后打印:

没有找到地址……

谁能帮我解决这个问题……提前谢谢你。

这是在 onCreate 方法中:

 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,3, this);

//分离方法:

public void geo(double latitude,double longitude)
    {

        if(Geocoder.isPresent())
        {

            try 
            {

            Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
         List<Address> listAddresses = geocoder.getFromLocation(latitude, longitude, 1);

            if(null!=listAddresses&&listAddresses.size()>0)
            {
                 Location = listAddresses.get(0).getAddressLine(0);

            }

        else
        {
            Toast.makeText(getBaseContext(), "Searching..",dur).show();
        }

        } 

        catch (Exception e) 
        {
            //Toast.makeText(this,Location, dur).show();

            Toast.makeText(getBaseContext(), "No address found",dur).show();
        }
        }
        else
        {
            Toast.makeText(getApplicationContext(),"wait...",dur).show();
        }
    }

这个geo方法在得到经纬度后调用onLocationChanged方法,来获取位置。

【问题讨论】:

    标签: android


    【解决方案1】:

    我认为问题在于地理编码器试图获取您的位置(也许它只是在等待传感器或网络的响应)。您应该在单独的线程中执行对地理编码器的请求以防止挂起(您可以使用AsyncTask)。但是请注意,所有与 UI 相关的工作,例如显示 toast,都必须在主 UI 线程中完成(您可以使用方法 runOnUiThread from Activity

    【讨论】:

    • 据你说,我已将反向地理编码的整个代码放在 asynctask 中,幸运的是问题已解决,但第二个出现的问题是当我调用 class Double[] lat_long = new Double[] {纬度,经度};新的 ReverseGeocodingTask(getBaseContext()).execute(latlong);在 onLocationChanged() 方法中,它没有被再次调用意味着它没有更新......请告诉我现在应该做什么......谢谢......
    • 我可以了解更多详情吗?是第一次在onLocationChanged中调用,是否可以看到更新的代码?
    • public void onLocationChanged(android.location.Location location) { if(location!=null) { double longitude = location.getLongitude();双纬度 = location.getLatitude(); Double[] lat_long = new Double[] { 纬度,经度};新的 ReverseGeocodingTask(getBaseContext()).execute(lat_long); //地理(纬度,经度); } else { Toast.makeText(getApplicationContext(),"等待...",dur).show(); } } //这是在onLocationChanged()方法中
    • 尝试 { listAddresses = geocoder.getFromLocation(latitude, longitude,1); if(null!=listAddresses&&listAddresses.size()>0) {位置 = listAddresses.get(0).getAddressLine(0); } }catch (Exception e) {} //This is in protected String doInBackground(Double... params).在执行后我打印了这个位置但是现在当我在bluestack中运行它时它告诉我位置但是在移动它没有显示任何位置即使有完整的网络并且还有gps......我不知道发生了什么...... .
    • 抱歉,我无法识别问题所在。如果它适用于模拟器但不适用于移动设备,您应该寻找 logcat 中的任何异常或一些配置问题。并尝试调试
    【解决方案2】:

    考虑到位置服务,您每 1 秒实例化一次收集位置信息,最好不要在 UI 线程中而是在服务或线程中使用此服务,并且遵循以下步骤是一个很好的做法:

    定义模型以获得最佳性能 基于位置的应用程序现在很常见,但由于不太理想的准确性、用户移动、获取位置的多种方法以及节省电池的愿望,获取用户位置是复杂的。为了克服在保持电池电量的同时获取良好用户位置的障碍,您必须定义一个一致的模型来指定您的应用程序如何获取用户位置。此模型包括您何时开始和停止侦听更新以及何时使用缓存的位置数据。

    获取用户位置的流程

    以下是获取用户位置的典型流程:

    1. 启动应用程序。 2. 稍后,开始收听来自 所需的位置提供商。 3.保持“当前最佳估计” 通过过滤掉新的但不太准确的修复来定位。 4.停止听 用于位置更新。 4. 利用最后的最佳位置 估计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多