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

挂起结果集结果回调延迟

越飞语
2023-03-14

我创建了一个应用程序,其中一个地点列表保存在数据库中。我只根据Google留档保存了保存地点的地点ID。

然后我创建了一个界面,让用户输入他们的当前位置(mCurrentLocation)。

然后,我创建了一个异步任务,检查数据库中保存的每个地点ID,并检查哪些地点距离用户位置500米以内。这是在doInBackground中完成的。根据Google文档,我使用了getPlaceById和setResultCallback

在帖子执行回收器视图更新。

问题:PendingResult setResultCallback似乎有延迟。根据我的日志,当setResultCallback尚未完成时,PostExecute已经被调用了!因此,我的“回收站”视图没有看到所有结果

日志:

内部for循环

内部for循环

内部for循环

for 循环已退出

输入后执行

内部for循环

内部for循环

@覆盖受保护的列表doInBackground(列表…列表){

        ArrayList<Places> selectedPlaces = new ArrayList<>();

        for ( int i = 0; i < lists[0].size(); i++) {


            // Get the place from the placeID
            PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.
                    getPlaceById(mGoogleApiClient, lists[0].get(i).getAddress());

            placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
                @Override
                public void onResult(@NonNull PlaceBuffer places) {

                    Log.v(LOG_TAG, "Inside for loop");

                    // Get the latitude and longitude for the specific place
                    LatLng latLng = places.get(0).getLatLng();

                    // Set the location object for the specific place
                    Location A = new Location("Place");
                    A.setLatitude(latLng.latitude);
                    A.setLongitude(latLng.longitude);

                    // get the distance of the place from the selected location
                    float distance = A.distanceTo(mUserLocation);

                    // if the distance is less than 500m
                    if (distance < 500) {
                        selectedPlaces.add(lists[0].get(position));
                    }
                }
            });
        }

        Log.v(LOG_TAG, "for loop exited");
        return selectedPlaces;
    }

    @Override
    protected void onPostExecute(List<Places> places) {
        Log.v(LOG_TAG, "onPostExecute entered");
        //update Recycler view

    }

共有1个答案

公羊光明
2023-03-14

我修改了代码。我应该使用await()代替setResultCallback。

所以新代码应该是这样的:

PlaceBuffer places = placeResult.await();

然后删除

placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
                @Override
                public void onResult(@NonNull PlaceBuffer places) {
 类似资料:
  • 问题内容: 我正在尝试创建一种方法,从中可以查询数据库并检索整个表。 目前,如果我使用这些数据只是正常工作 中 的方法。但是,我希望该方法返回结果。 我正在了解当前代码。 我该如何实现? 问题答案: 您永远不要通过公共方法来回避。这很容易导致资源泄漏,因为您不得不保持语句和连接打开。关闭它们将隐式关闭结果集。但是,将它们保持打开状态将导致它们悬而未决,并且当它们打开过多时,将导致数据库用尽资源。

  • 问题内容: 我一直在尝试使用Java的ProcessBuilder在Linux中启动应“长期”运行的应用程序。该程序的运行方式是启动命令(在本例中,我正在启动媒体播放应用程序),允许其运行并检查以确保它没有崩溃。例如,检查PID是否仍处于活动状态,然后重新启动该进程(如果已终止)。 我现在遇到的问题是PID在系统中仍然有效,但是应用程序的GUI挂起了。我尝试将ProcessBuilder(cmd)

  • 在我的控制器中,我返回由另一个线程填充的延迟结果: FooController.java 页面准备者.java 显然,再次调用所有筛选器以“完成”请求。我的一个过滤器,需要访问 豆,这是请求范围的。该调用引发异常 查看我配置的异常: 但是没有区别。我该怎么解决这个问题?

  • 问题内容: 我正在使用JDBC来实现非常简单的数据库连接。 我已经创建了连接/语句并执行了查询。我在调试器中检查语句的查询对象,以确认它正在发送正确的查询。然后,我再次检查了数据库中的查询(直接从调试器复制),以确保其返回数据。但是,返回的结果集在.next()上给出false 这里有我遗漏的常见陷阱吗? 还有myDB类(一个简单的包装程序,使我可以将连接/语句代码放入任何项目中) 编辑:根据建议

  • 主要内容:ResultSet类型,ResultSet的并发性,浏览结果集,查看结果集,更新结果集SQL语句执行后从数据库查询读取数据,返回的数据放在结果集中。 语句用于从数据库中选择行并在结果集中查看它们的标准方法。 接口表示数据库查询的结果集。 对象维护指向结果集中当前行的游标。 术语“结果集”是指包含在对象中的行和列数据。 接口的方法可以分为三类: 浏览方法:用于移动光标。 获取方法:用于查看光标指向的当前行的列中的数据。 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数

  • 我有以下四个测试,最后一个测试在运行时挂起。为什么会发生这种情况: 我使用这个扩展方法的restSharp RestClient: 为什么最后一个测试挂起?