gpt4 book ai didi

java - 如何提高 AsyncTask 的速度?

转载 作者:行者123 更新时间:2023-12-01 19:08:02 25 4
gpt4 key购买 nike

我正在开发一个应用程序,为您提供两点之间的平均速度,但我找不到在单独的 AsyncTask 中分离“位置逻辑”的方法。我必须检查您是否位于两个(起点/终点)点之一,然后将即时速度添加到列表中并计算每次平均值并显示它。我想使用 LocationListener,但如何在异步任务中使用它?

在 AsyncTask 中(我已经获得了主 Activity 中请求的所有权限):

protected String doInBackground(Integer... integers) {
Looper.prepare();
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
Log.d(TAG,"READY");
Log.d(TAG,locationListener.);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, gpsInterval, 0, locationListener);
Log.d(TAG,"DONE");
return "";
}

我在 logcat 中看到“准备好”和“完成”,但 myLocationListener 中没有看到任何内容

public class MyLocationListener  implements LocationListener  {

private static final String TAG = "MyLocationListener ";

private MySpeedList speedList= new MySpeedList();


@Override
public void onLocationChanged(Location location) {

Log.d(TAG,Float.toString(location.getSpeed()));
speedList.add(location.getSpeed());
Log.d(TAG,Float.toString(speedList.getAverageSpeed()));
}

...

有人有建议吗?我是一名学生,所以我是 android 的初学者,这是我的第一个“大项目”

最佳答案

您应该在位置监听器本身内部执行异步任务,并将这些行移出到主线程:

locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
Log.d(TAG,"READY");
Log.d(TAG,locationListener.);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, gpsInterval, 0, locationListener);
Log.d(TAG,"DONE");
return "";

在你的监听器中:

public class MyLocationListener  implements LocationListener  {

private static final String TAG = "MyLocationListener ";

private MySpeedList speedList= new MySpeedList();


@Override
public void onLocationChanged(Location location) {
if (calculationsTask == null || calculationsTask.getStatus() == AsyncTask.Status.FINISHED) {
calculationsTask = new CalculationsTask()
calculationsTask.execute(location);
} else {
// buffer pending calculations here or cancel the currently running async task
}
}

...

计算任务

 private class CalculationsTask extends AsyncTask<Location, Integer, Long> {
protected Long doInBackground(Location location) {
// do calculations here
return speed;
}

protected void onPostExecute(Long result) {
// this method is executed in UI thread
// display result to user
}
}

在这里,您可以通过 onPostExecute(...) 方法传递计算结果,因为该方法在主线程上运行。另请注意,您无法第二次执行异步任务,因此每次都必须创建一个新实例。

此外,如果您想在异步任务中访问 speedList,您可以将 CalculationsTask 设为 MyLocationListener 的内部类,或者只是将其作为参数传递。

关于java - 如何提高 AsyncTask 的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59513599/

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