我正在使用异步任务创建折线选项,每个坐标有 50 个坐标,并在发布进度方法中将折线添加到地图中。如果它运行的时间过长并且没有运行,我仍然有一个进度对话框,用户可以使用后退按钮取消任务。我最大的测试是来自 sqllite 数据库的 3000 个坐标。但是,如果每个折线选项有两个坐标,则此代码会在调用 publishprogress 时陷入困境,因此您必须堆叠几十条两条坐标折线,然后在 publishprogress 方法中将它们添加到地图中。 PublishProgress 采用一个数组,因此传入 50 个折线选项并不难。在使用每条折线 50 个坐标进行调试时,您可以看到在地图上绘制的折线。在实时模式下,折线仅在一秒钟内出现在我便宜的 50 美元测试手机上。
注意:我将所有异步任务作为单独的 .java 文件执行,因此我可以在构造函数中传递我需要的任何内容,因此我有相同的 cancelMe() 代码。我使用的大部分代码都在下面,我省略了数据库的内容,因为每个人都会有所不同。
public class TaskParseKmldb extends AsyncTask<KmlSummary, PolylineOptions, Boolean>
implements OnCancelListener {
public interface TaskParseKmldbCallback {
void onTaskParseKmldbComplete(boolean success);
}
public TaskParseKmldb(Activity activity, KmlSummary kmlSummary, GoogleMap mMap,
ProgressDialog pd) {
this.activity = activity;
this.kmlSummary = kmlSummary;
this.mMap = mMap;
this.pd = pd;
// determine if calling activity has implemented the callback interface
callback = (TaskParseKmldbCallback.class.isAssignableFrom(activity
.getClass())) ? (TaskParseKmldbCallback) activity : null;
}
... 为 onCanceled 例程设置进程对话框侦听器。
@Override
protected void onPreExecute() {
pd.setOnCancelListener(this);
pd.setMessage("Loading Recorded Route...");
pd.show();
}
@Override
protected void onCancelled(Boolean result) {
if (pd != null) {
pd.dismiss();
pd = null;
}
if (callback != null) {
callback.onTaskParseKmldbComplete(result);
}
}
@Override
public void onCancel(DialogInterface dialog) {
cancelMe(); // this just gracefully cancels the task.
}
public void cancelMe() {
if (!getStatus().equals(Status.FINISHED)) {
// not canceled
if (!isCancelled()) {
cancel(false);
try {
get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CancellationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
... doInBackground 中的某处
if (progress.getPoints().size() > 0) {
publishProgress(progress);
ret = true;
}
protected void onProgressUpdate(PolylineOptions... progress) {
if (isCancelled()) {
return;
}
if (progress[0] != null) {
// add the poly line to the map
// save the polyline returned by the map for later use
polylines.add(mMap.addPolyline(progress[0]));
}
}
...
@Override
protected void onPostExecute(Boolean result) {
if (pd != null) {
pd.dismiss();
pd = null;
}