如何在地图集成应用程序中使用处理程序线程时避免使用Android ANR?

时间:2011-11-06 11:30:03

标签: android

我正在尝试在Android中构建Google地图集成。我的应用只是在地图中显示当前位置。我能够从GPS获得正确的纬度和经度值,并且使用覆盖类将其指向地图上最近的位置。我正在尝试将GPS纬度和经度值转换为其地名,这是在单独的处理程序线程中完成的。当我的应用程序运行后,某个时候Android设备将进入屏幕锁定模式。解锁屏幕后,我看到我的当前mapActivity在一段时间内没有响应,系统生成Android ANR消息“强制关闭”此活动。是不是因为我的处理程序Thread没有响应主系统ui线程?或者有任何其他问题吗? 处理程序线程的代码片段如下所示......

        private void ConvertPointToLocation(GeoPoint point) {
        final GeoPoint p= point;
        Thread thrd = new Thread()
        {
        public void run(){

                    Geocoder geoCoder = new Geocoder(       
                        getBaseContext(), Locale.getDefault());
                    try {
                        List<Address> addresses = geoCoder.getFromLocation(
                        p.getLatitudeE6()  / 1E6, 
                        p.getLongitudeE6() / 1E6,  1);

                        if (addresses.size() > 0) {
                            for (int indexValues = 0;    
                                index < addresses.get(0).getMaxAddressLineIndex(); indexValues++)
                                address += addresses.get(0).getAddressLine(indexValues) + " ";
                        }
                        uiCallback.sendEmptyMessage(0);

                    }
                    catch (IOException e) {        
                        e.printStackTrace();
                    }
        }
    };
    thrd.start();
    }

     private Handler uiCallback=new Handler(){
         @Override
         public void handleMessage(Message msg)
         {
       //TextView locationNameDisplay value is set by address String variable...
             locationNameDisplay.setText(address);
             address="";
         }
     };

我需要知道为什么当我的活动进入后台时,Android Not Responding对话框会出现。

我欢迎你的帮助和建议,因为我是这个领域的新手,我正在学习新的东西?

1 个答案:

答案 0 :(得分:-1)

您可能需要为此类任务创建Service,因为使用ServicesThreads之间存在差异。当你有一个相对较长的运行操作,比如下载一些东西时,你应该使用一个单独的Thread。此时启动此线程的活动必须位于前台。当您需要执行一些非常长时间运行的操作时,您应该使用Service让用户关闭您的应用程序并执行其他操作,而服务仍在后台运行。希望这会有所帮助。