在getview()方法中使用Async Task

时间:2015-08-03 11:13:46

标签: java android azure android-asynctask azure-mobile-services

我有这些代码行,我想在getview()的{​​{1}}方法中使用。

CustomAdapter

这是我的AsyncTask代码,我用来填充自定义listview。这段代码一直在运行,我不知道多少次。但是最后它在TextView( 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(); )上进行了如此多的更新后给了我正确的结果。这不仅会降低我的应用程序的性能,还会在到达结果之前在TextView上显示多个更新。

我在designation变量中获取数据,查看我的代码。

数据来自azure但是如果你不是一个天蓝色的人,不要担心。请帮我解决Java问题。

问题

我的问题是如何在desig[0]方法中使用Async task。我必须做功能,我可以称之为后者。数据来自azure但不要担心,如果你不是一个天蓝色的家伙。只是帮助我解决Java问题。 plzz帮助

3 个答案:

答案 0 :(得分:2)

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

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

修改

由于指定是每个单元格中的文本,因此您必须确保要升级的单元格是好的单元格。 我通常做的是使用我附加到循环视图的ViewHolder。然后我将ViewHolder注册为听众(收听AsyncTask)。 ViewHolder启动请求并为AsyncTask提供ID。然后,在AsyncTask正在运行时,我会定期询问ViewHolder是否提供给AsyncTask的ID是好的。如果不是,我取消AsyncTask(不需要同步)。 然后,当AsyncTask完成时,我检查ID最后一次与ViewHolder给出的ID匹配,并通知监听器(ViewHolder)结果可用。 通过这种方式,您可以确保AsyncTask无法正常工作。

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

答案 1 :(得分:1)

调用Frag的side Activity或onActivityCreated中的AsyncTask子类,并将结果传递给CustomAdapter以更新视图。如果您可以播放您的活动或片段类,以查看适当的位置。

答案 2 :(得分:1)

您需要为您查看数据模型。比如创建一个包含所有显示信息的类(这里是if let deletedObjects = noti.userInfo?[NSDeletedObjectsKey] as? NSArray { // use `deletedObjects` here } 的字符串)。因此,您可以更新desig[0]中的视图。

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