Android 为什么应用程序停止一段时间并且按钮也没有按下

Android 为什么应用程序停止一段时间并且按钮也没有按下,android,Android,这是我程序的要点。当我按下按钮告知位置时,如果geocoder没有抛出任何异常,它可以正常工作,但当geocoder抛出异常,同时我的应用程序停止一段时间,就像挂起一样,问题就来了 因为进度条停止旋转,停止按钮也未按下。但30秒或1分钟后,它会打印: 找不到地址 有谁能帮我把这个问题分开…先谢谢你 这在onCreate方法中: locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

这是我程序的要点。当我按下按钮告知位置时,如果geocoder没有抛出任何异常,它可以正常工作,但当geocoder抛出异常,同时我的应用程序停止一段时间,就像挂起一样,问题就来了

因为进度条停止旋转,停止按钮也未按下。但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();
        }
    }
//单独方法:

 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();
        }
    }

此地理方法在获取纬度和经度后调用onLocationChanged方法来获取位置。

我认为问题在于地理编码器试图获取您的位置,可能只是在等待传感器或网络的响应。您应该在一个单独的线程中执行对地理编码器的请求,以防止挂起您可以使用的挂起。但是请注意,所有与UI相关的工作,如显示祝酒词,都必须在主UI线程中完成。考虑到位置服务,您可以使用方法

每1秒实例化一次收集位置信息,并且最好在服务或线程中使用此服务,而不是在UI线程中使用此服务,并且是遵循以下步骤的良好实践:

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

获取用户位置的流程

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

启动应用程序。2.稍后,开始侦听来自的更新 所需的位置提供者。3.保持对以下各项的当前最佳估计: 通过过滤掉新的但不太准确的修复来定位。4.别再听了 获取位置更新。4.利用最后一个最佳位置 估计
根据您的说法,我已经将我的全部反向地理编码代码放在asynctask中,幸运的是问题已经解决,但第二个出现的问题是,当我调用类Double[]lat_long=new Double[]{lation,longitude};新的ReverseGeocodingTaskgetBaseContext.ExecuteRelatLong;在onLocationChanged方法中,它没有再次调用意味着它没有更新…请告诉我现在应该做什么…谢谢…我可以了解更多详细信息吗?它是在onLocationChanged中第一次调用的,并且可以看到更新的代码吗?public void onLocationChangedDroid.location.location位置{iLocation!=null{double longitude=location.getLengitude;double lation=location.getLatitude;double[]lat_long=new double[]{纬度,经度};new ReverseGeoCodengTaskGetBaseContext.ExecuteTelat_long;//地理纬度,经度;}其他{Toast.makeTextgetApplicationContext,Wait…,dur.show;}}//这是在onLocationChanged methodtry中{listAddresses=geocoder.getFromLocationlatitude,longitude,1;ifnull!=listAddresses&&listAddresses.size>0{Location=listAddresses.get0.getAddressLine0;}}捕获异常e{}//这是一个受保护的字符串doInBackgroundDouble…params。在post excecute中,我打印了这个位置,但现在当我在bluestack中运行它时,它会告诉我位置,但在移动设备中,它不会显示任何位置,即使有完整的网络和gps…我不知道发生了什么…抱歉,我无法识别问题。如果它在emulator上工作但在移动设备上不起作用,您应该在logcat中查找任何异常或一些配置问题,并尝试调试