gpt4 book ai didi

android - 如何使用 AsyncTask 和线程?

转载 作者:搜寻专家 更新时间:2023-11-01 09:08:09 24 4
gpt4 key购买 nike

目标:
使用 Google App Engine 服务器和 Android 客户端,我试图在 Android 客户端用户叠加层上放置 Google map 。每 30 秒我轮询一次服务器并获取包含用户的 Vector 并将其添加到 map 。

当前状态:
我在一个新线程中使用所有这些,所以在运行应用程序后我得到:
奇怪的行为(延迟叠加、多重叠加),然后被 ConcurrentModificationException 压垮。
阅读了一下之后,我发现我需要使用 AsyncTask

如果我错了请纠正我,但我知道在 onCreate 的 Activity 中所做的一切都在 UIhread 中“运行”,所以我需要将“逻辑”(所有网络处理)放在 doInBackground 和所有 UI 中像在 onPostExecute 中将叠加层放在 map 上一样处理。

我的问题是:
1)目前我在做的事情:

new Thread()
{
@Override
public void run()
{
super.run();
while(true)
{
SystemClock.sleep(30000);
Vector responseFromServer = getUsersVectorFromServer();
putNewOnlineUserOnTheMap();
}
}
}.start();

将此转换为 AsyncTask 的正确方法是什么?
我是否仍在 doInBackground 中使用新线程轮询服务器,还是有正确的方法来执行此操作?

2) 是否有一个特定的列表,说明什么可以算作 UI 放在 onPostExecute 或任何概念列表中?
就我而言,我猜想需要将 putNewOnlineUserOnTheMap() 放在 onPostExecute 中。

谢谢。

最佳答案

类似下面的内容:

class UpdateTask extends AsyncTask<Void, Vector, Void>{

@Override
protected Void doInBackground(Void... params) {
// this is running in a background thread.
while (!isCancelled()) {
SystemClock.sleep(30000);
Vector responseFromServer = getUsersVectorFromServer();
// send the result back to the UI thread
// onProgressUpdate will be called then
publishProgress(responseFromServer);
}
return null;
}

@Override
protected void onProgressUpdate(Vector... values) {
// this is executed on the UI thread where we can safely touch UI stuff
putNewOnlineUserOnTheMap(values[0]);
}

}

你不能使用任务的结果,因为任务已经完成了。但是你可以使用进度发布机制来获得周期性的结果。如果您像那样使用它并在 UI 线程上进行修改,您不应该得到 ConcurrentModificationException,因为您在一个可以安全修改 UI 的线程上进行修改。

这里要注意一件事:在后台线程中创建 Vector 的新实例,然后使用它来更新 UI。但是之后不要在后台线程中触摸同一个对象。这样你就不需要任何同步,因为在后台线程将它发送出去后,只有 UI 线程接触它。 (并且您可以使用简单的 ArrayList 而不是 Vector)

关于android - 如何使用 AsyncTask 和线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10363025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com