当前位置: 首页 > 知识库问答 >
问题:

正在添加用于搜索位置的AsyncTask

薄瑞
2023-03-14

所以我想申请目前的职位。下面的代码运行良好

String stringAddress = "";

public void getLocation(View view){
    final LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);

    Criteria kriteria = new Criteria();
    kriteria.setAccuracy(Criteria.ACCURACY_FINE);
    kriteria.setAltitudeRequired(false);
    kriteria.setBearingRequired(false);
    kriteria.setCostAllowed(true);
    kriteria.setPowerRequirement(Criteria.POWER_LOW);
    final String provider = lm.getBestProvider(kriteria, true);

    final Location lokasi = lm.getLastKnownLocation(provider);
    updateWithNewLocation(lokasi);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 5, ll);

    edittext_position.setText(stringAddress);
}

private void updateWithNewLocation(Location 
    if(lokasi != null){
        double lat = lokasi.getLatitude();
        double lng = lokasi.getLongitude();
        Geocoder gc = new Geocoder(this, Locale.getDefault());

        try{
            List addresses = gc.getFromLocation(lat, lng, 1);
            StringBuilder sb = new StringBuilder();

            if(addresses.size()>0){
                Address address = addresses.get(0);
                sb.append(address.getAddressLine(0));
                stringAddress= sb.toString();
            }

        } catch (Exception e){

        }
    }
}

private final LocationListener ll = new LocationListener() {
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    public void onProviderEnabled(String provider) {

    }

    public void onProviderDisabled(String provider) {
        updateWithNewLocation(null);
    }

    public void onLocationChanged(Location location) {
        updateWithNewLocation(location);
    }
}

但问题是每次调用getLocation()函数时,应用程序在返回结果之前会挂起几秒钟。我知道使用aSyncTask来解决这个问题,但我不知道如何开始。感谢你的帮助。

谢谢

共有2个答案

蓝恩
2023-03-14

RequestLocationUpdates()是异步的,它不会阻止您的应用程序。它在后台轮询位置,然后调用侦听器。

但是,GC.getFromLocation()不是。这很可能是你滞后的原因

创建一个新的asynctask,Eclipse会建议您重写这些方法

@Override
protected List<String> doInBackground(String... params) {
   // this is done in the background so it won't block the UI. The return type must be set to List<String> (I think default is just String)
   return gc.getFromLocation()
}


@Override
protected void onPostExecute(List<String> adresses) {
    // called when the GC work is finished. You can now use your list of addresses and display them
}

不要忘记对任务调用execute()

梁俊智
2023-03-14

这是我应用程序中的片段:

public void getCurrentLocation(final ListenerGetCurrentLocation listenerGetCurrentLocation) {
    new AsyncTask<Void, Void, List<Address>>() {

        @Override
        protected List<Address> doInBackground(Void... voids) {
            Geocoder geo = new Geocoder(instance);

            List<Address> listAddresses = null;

            Criteria criteria = new Criteria();
            String bestProvider = locationManager.getBestProvider(criteria, true);

            if (bestProvider == null) {
                bestProvider = LocationManager.NETWORK_PROVIDER;
            }

            Location location = locationManager.getLastKnownLocation(bestProvider);

            try {
                if (location != null) {
                    listAddresses = geo.getFromLocation(location.getLatitude(), 
                                                        location.getLongitude(), 
                                                        1);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            return listAddresses;
        }

        public void onPostExecute(List<Address> listAddresses) {                
            Address _address = null;
            if ((listAddresses != null) && (listAddresses.size() > 0)) {
                _address = listAddresses.get(0);

                GeoPoint currentPosition = new GeoPoint(((int)(_address.getLatitude() * 1E6)), 
                                                        ((int)(_address.getLongitude() * 1E6)));
            }

        }

    }.execute();
}
 类似资料:
  • 问题内容: 我有一个查询,用于查找按位置排序的结果。结果还必须考虑增值税,因此这也在查询中。不幸的是,该查询在未缓存时可能需要4秒钟以上的时间才能运行。谁能发现任何明显的问题或建议我做些什么来改善它? 只是为了澄清查询中正在发生的事情: 计算的距离是使用经/纬度的欧几里得距离 当包含增值税时,incvat字段用于显示价格 WHEN / THEN语句用于将价格0置于最底端 查询: 问题答案: 您可以

  • 该问题出现在IntellJ 14.1.4社区版中。Gradle直到今天都能很好地构建项目,同样的代码在其他机器上也能很好地构建。 我得到了这个错误:“找不到ormlite-core-4.48.jar(com.j256.ormlite:ormlite-core:4.48)。在以下位置搜索:https://repo1.maven.org/maven2/com/j256/ormlite/ormlite-

  • 操作步骤: ①以编辑状态进入地图,点击左侧图例面板中要使用的图层,所选图层的边缘显示为蓝色,表示新添加的标注将绘制在此图层上。 ②点击地图右上方工具栏上的"搜索"图标。 ③弹出搜索框。 ④在搜索框内输入关键字(如:天安门)后,点击搜索/回车。 ⑤在左边的搜索结果列表框中选择正确的地点,点击信息窗上的"添加点"按钮。 ⑥点击"完成"添加记录成功。 操作动图: [查看原图]

  • public void drop(字符串名称)--如果合适,从ArrayList中移除该项,并将其添加到当前房间。使用以下选项之一更新游戏的消息:1)玩家没有持有该项目,2)房间已经有一个项目,或者3)玩家已经成功地将该项目放入房间。这是此方法的目标,但当我运行它时,它总是跳到else语句中的currentMessage。 问题:我遇到的问题是,当我运行这个方法并试图将一个项目放到房间中时,它没有

  • 问题内容: 这似乎是一个简单的问题,但是我以前找不到它(这个和这个很接近,但是答案不是很好)。 问题是:如果我想在df中 某处 搜索值(我不知道它在哪一列中),然后返回所有具有匹配项的行。 什么是Pandaic最有效的方法?还有什么比: ? 问题答案: 您可以对整个DataFrame执行相等比较: 另一个选择是使用比较:

  • 我不知道为什么我会看到这种行为。我在APNS有效载荷中使用loc键和loc参数。当没有参数时,它工作正常: "你的技术人员到了" 当我填充loc参数时,ios会在通知中添加换行符和括号: “你的技术,( 胜利者 ),已经到了” 这是我发送的有效载荷: {“APN”:{“loc键”:“到达键”,“loc参数”:[“Victor”],“徽章”:0,“声音”:“钟声”} 有人有什么想法吗?