Java 异步任务Android中的多请求
我对Android中的异步任务有一些问题。因此,当单次点击映射时,它将通过在AsyncTask类中传递一个事件对象作为参数来执行该方法,以获得基于坐标X和Y的地址:Java 异步任务Android中的多请求,java,android,mysql,android-asynctask,Java,Android,Mysql,Android Asynctask,我对Android中的异步任务有一些问题。因此,当单次点击映射时,它将通过在AsyncTask类中传递一个事件对象作为参数来执行该方法,以获得基于坐标X和Y的地址: mMapView.setOnSingleTapListener(new OnSingleTapListener() { public void onSingleTap(float x, float y) { final Point point = mMapView.toMapPoint(x,
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
public void onSingleTap(float x, float y) {
final Point point = mMapView.toMapPoint(x, y);
eventModel.setEventX(String.valueOf(point.getX()));
eventModel.setEventY(String.valueOf(point.getY()));
new MyAsyncTask(new MyAsyncTask.OnRoutineFinished() {
public void onFinish() {
CreateEvent.createEventDialog(context, point.getX(),
point.getY(), eventAddress); //this will be called after the task finishes
}
}).execute(eventModel);
}
});
new MyAsyncTask().execute();
}
MyAsyncTask类
public static class MyAsyncTask extends AsyncTask<Event, Integer, Double> {
public interface OnRoutineFinished{ //interface
void onFinish();
}
private OnRoutineFinished mCallbacks;
public MyAsyncTask(OnRoutineFinished callback){ //constructor with interface
mCallbacks = callback;
}
public MyAsyncTask(){} //empty constructor to maintain compatibility
@Override
protected Double doInBackground(Event... params) {
try {
eventAddress = eventCtrl.getStreetAddressFromGeometry(eventModel.getEventX(), eventModel.getEventY());
eventCtrl.retrieveEventJSON();
if (params.length == 1) {
eventCtrl.createEvent(params[0]);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Double result) {
if(mCallbacks !=null)
mCallbacks.onFinish(); //call interface on finish
}
protected void onProgressUpdate(Integer... progress) {
}
}
一旦用户单击OK,它将通过servlet将DB插入MySQL。onConfirmAddEventClicked()基本上是获取每个属性的所有用户输入和设置值,并作为事件对象返回
然而,我现在遇到的问题是,即使用户单击cancel,它仍然只使用坐标X和Y执行DB插入。我猜这是因为MyAsynctask中的if语句包含一个参数
当用户单击OK时,是否有任何方法仅执行DB插入?提前谢谢
编辑
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
private static final long serialVersionUID = 1L;
public void onSingleTap(float x, float y) {
final Point point = mMapView.toMapPoint(x, y);
eventModel.setEventX(String.valueOf(point.getX()));
eventModel.setEventY(String.valueOf(point.getY()));
new MyAsyncTask().execute(eventModel);
}
});
new MyAsyncTask().execute();
}
protected void onPostExecute(Double result) {
if(mCallbacks !=null)
mCallbacks.onFinish(); //call interface on finish
CreateEvent.createEventDialog(context, Double.parseDouble(eventModel.getEventX()),
Double.parseDouble(eventModel.getEventY()), eventAddress);
}
使用这些代码,我将收到以下错误消息:
11-11 21:41:29.457: D/dalvikvm(7062): GC_CONCURRENT freed 457K, 12% free 11022K/12423K, paused 74ms+124ms
11-11 21:41:34.074: D/dalvikvm(7062): GC_CONCURRENT freed 620K, 13% free 11021K/12551K, paused 56ms+237ms
11-11 21:41:37.589: D/dalvikvm(7062): GC_CONCURRENT freed 597K, 13% free 11018K/12615K, paused 29ms+7ms
11-11 21:41:39.441: D/AndroidRuntime(7062): Shutting down VM
11-11 21:41:39.441: W/dalvikvm(7062): threadid=1: thread exiting with uncaught exception (group=0x40c7e1f8)
11-11 21:41:39.464: E/AndroidRuntime(7062): FATAL EXCEPTION: main
11-11 21:41:39.464: E/AndroidRuntime(7062): java.lang.NullPointerException
11-11 21:41:39.464: E/AndroidRuntime(7062): at java.lang.StringToReal.parseDouble(StringToReal.java:244)
11-11 21:41:39.464: E/AndroidRuntime(7062): at java.lang.Double.parseDouble(Double.java:295)
11-11 21:41:39.464: E/AndroidRuntime(7062): at nyp.edu.eneighbourhood.ENeighbourhoodActivity$MyAsyncTask.onPostExecute(ENeighbourhoodActivity.java:227)
11-11 21:41:39.464: E/AndroidRuntime(7062): at nyp.edu.eneighbourhood.ENeighbourhoodActivity$MyAsyncTask.onPostExecute(ENeighbourhoodActivity.java:1)
11-11 21:41:39.464: E/AndroidRuntime(7062): at android.os.AsyncTask.finish(AsyncTask.java:602)
11-11 21:41:39.464: E/AndroidRuntime(7062): at android.os.AsyncTask.access$600(AsyncTask.java:156)
11-11 21:41:39.464: E/AndroidRuntime(7062): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
11-11 21:41:39.464: E/AndroidRuntime(7062): at android.os.Handler.dispatchMessage(Handler.java:99)
11-11 21:41:39.464: E/AndroidRuntime(7062): at android.os.Looper.loop(Looper.java:137)
11-11 21:41:39.464: E/AndroidRuntime(7062): at android.app.ActivityThread.main(ActivityThread.java:4512)
11-11 21:41:39.464: E/AndroidRuntime(7062): at java.lang.reflect.Method.invokeNative(Native Method)
11-11 21:41:39.464: E/AndroidRuntime(7062): at java.lang.reflect.Method.invoke(Method.java:511)
11-11 21:41:39.464: E/AndroidRuntime(7062): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982)
11-11 21:41:39.464: E/AndroidRuntime(7062): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
11-11 21:41:39.464: E/AndroidRuntime(7062): at dalvik.system.NativeStart.main(Native Method)
11-11 21:41:56.082: I/dalvikvm(7062): threadid=3: reacting to signal 3
11-11 21:41:56.160: I/dalvikvm(7062): Wrote stack traces to '/data/anr/traces.txt'
我认为出现此错误是因为当用户重复键入时会有多个
AsyncTasks
运行
如果可能,尝试移动您的对话框代码>从setPositiveButton
到onPostExecute
。这样做将确保对话框
在异步任务
完成任务之前不会关闭,因此(我认为)将消除该错误
更新
我刚刚意识到您执行了两次AsyncTask:
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
public void onSingleTap(float x, float y) {
final Point point = mMapView.toMapPoint(x, y);
eventModel.setEventX(String.valueOf(point.getX()));
eventModel.setEventY(String.valueOf(point.getY()));
new MyAsyncTask(new MyAsyncTask.OnRoutineFinished() {
public void onFinish() {
CreateEvent.createEventDialog(context, point.getX(),
point.getY(), eventAddress); //this will be called after the task finishes
}
}).execute(eventModel); //1st
}
});
//new MyAsyncTask().execute(); //2nd, try to comment this
}
如果它仍然不起作用,请查看我的注释并尝试将createEventDialog
移动到onPostExecute
(不再需要使用callback
和onFInish
)但是现在的问题就像我在地图上点击一次,它获取坐标X和Y,并立即执行eventCtrl.createEvent,而不是进入createEventDialog,仅在用户单击“确定”后执行(@IWasSoLost请查看我更新的答案。尝试通过仅使用1个asyncTask来简化代码我需要asyncTask在一次点击时获取地址并将其传递给createEventDialog尝试删除onFinish,将createEventDialog移动到onPostExecute…查看是否有任何不同我实际需要onFinish以便createDialogEvent将填充eventAddress。那么您有什么想法吗?想解释一下吗?
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
public void onSingleTap(float x, float y) {
final Point point = mMapView.toMapPoint(x, y);
eventModel.setEventX(String.valueOf(point.getX()));
eventModel.setEventY(String.valueOf(point.getY()));
new MyAsyncTask(new MyAsyncTask.OnRoutineFinished() {
public void onFinish() {
CreateEvent.createEventDialog(context, point.getX(),
point.getY(), eventAddress); //this will be called after the task finishes
}
}).execute(eventModel); //1st
}
});
//new MyAsyncTask().execute(); //2nd, try to comment this
}