在 getview() 方法中使用 Async Task

Using Async Task inside getview() method

我有这些代码行,我想在 CustomAdaptergetview() 方法中使用它们。

 new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    try {
                        final MobileServiceList<User> result =
                                mUser.where().field("name").eq(currentItem.getTo()).select("designation").execute().get();
                        int counter=
                                mUser.where().select("designation").execute().get().getTotalCount();
                        for (User item : result) {
                            // Log.i(TAG, "Read object with ID " + item.id);
                            desig[0] = item.getDesignation();
                            Log.v("FINALLY DESIGNATION IS", desig[0]);


                        }

                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    super.onPostExecute(aVoid);
                    // gb.setDesignation(desig[0]);

                    designation.setText(desig[0]);

                }
            }.execute();

这是我的 AsyncTask 代码,我用它来填充自定义列表视图。这段代码一直在 运行,我不知道有多少次。但最终在对 TextView (designation) 进行了如此多的更新后,它给了我正确的结果。这不仅会降低我的应用程序的性能,还会在到达结果之前在 TextView 上显示多个更新。

我正在 desig[0] 变量中获取数据,看看我的代码。

数据来自 azure 但如果您不是 azure 的人,请不要担心。请在 Java 部分帮助我。

问题

我的问题是如何在 getview() 方法中使用 Async task。我是否必须制作功能,我可以调用后者。数据来自 azure 但是如果你不是 azure 的人也不要担心。请在 Java 部分帮助我。请帮忙

每次必须绘制一行列表视图时,都会调用

getView。所以不要忘记同时会有多个doInBackground运行。什么是 designation ? ListView 元素内的视图 ?

编辑

由于名称是每个单元格中的文本,因此您必须确保要升级的单元格是好的单元格。 我通常做的是使用 ViewHolder 附加到回收视图。然后我将 ViewHolder 注册为监听器(监听 AsyncTask)。 ViewHolder 启动请求并为 AsyncTask 提供一个 ID。然后,虽然 AsyncTask 是 运行,但我会定期询问 ViewHolder 提供给 AsyncTask 的 ID 是否正确。如果不是,我取消 AsyncTask (不需要同步)。 然后,当 AsyncTask 完成时,我最后一次检查 ID 是否与 ViewHolder 给出的 ID 匹配,并通知侦听器 (ViewHolder) 结果可用。 这样,您就可以确定 AsyncTask 没有白做。

但这当然取决于您在 AsyncTask 中实际执行的任务类型...

在Fragment的Activity侧或ActivityCreated上调用AsyncTask subclass并将结果传递给CustomAdapter以更新视图。如果你可以播放你的 Activity 或片段 class 看看放在哪里合适。

您需要制作一个数据模型供您查看。比如制作一个包含所有显示信息的 class(这里是 desig[0] 的字符串)。这样您就可以更新 AsyncTask.onPostExecute().

中的视图

或者如果您需要视图仅在 desig 获取时显示,请隐藏它或在从 azure 获取 desig 时添加一个加载等待对话框。