在 AlertDialog 中使用 AsyncTask 会带来滞后的 UX?
Using AsyncTask in AlertDialog brings out lagging UX?
我知道这是描述问题的一种奇怪的标题。我有如下代码:
new AlertDialog.Builder(getActivity()).setView(myScrollView)
.setPositiveButton("Sent Query", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
try {
JSONStringURL = myURL_here;
image = new AsyncTaskParseJson1(JSONStringURL).execute().get();
if (image.size() == 0) {
Toast.makeText(getActivity(), "no data", Toast.LENGTH_LONG).show();
} else {
overlayImage(image);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}.show();
当我按下 "Positive Button" 时,应用程序应立即取消 AlertDialog,然后执行 AsyncTask。不幸的是,AlertDialog 会滞后 3~4 秒,然后 运行 AsyncTask 让用户体验感觉非常糟糕,但我不知道为什么会滞后?
NEVER
使用 AsyncTask.get()
。这让你等待任务完成,这完全破坏了它是异步的想法。该功能甚至存在的事实是 Android 中的设计缺陷。相反,在 AsyncTask
完成后需要完成的任何事情都应该在任务的 onPostExecute()
中完成(或在从那里调用的函数中完成)。
显然这是你的问题 - 你没有关闭对话框并并行执行任务,你正在等待任务完成(记住 UI
在控制权返回之前不会更新UI 线程循环器)。
您必须使用这些更改
dialog.dismiss();
代替
dialog.cancel();
我知道这是描述问题的一种奇怪的标题。我有如下代码:
new AlertDialog.Builder(getActivity()).setView(myScrollView)
.setPositiveButton("Sent Query", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
try {
JSONStringURL = myURL_here;
image = new AsyncTaskParseJson1(JSONStringURL).execute().get();
if (image.size() == 0) {
Toast.makeText(getActivity(), "no data", Toast.LENGTH_LONG).show();
} else {
overlayImage(image);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}.show();
当我按下 "Positive Button" 时,应用程序应立即取消 AlertDialog,然后执行 AsyncTask。不幸的是,AlertDialog 会滞后 3~4 秒,然后 运行 AsyncTask 让用户体验感觉非常糟糕,但我不知道为什么会滞后?
NEVER
使用 AsyncTask.get()
。这让你等待任务完成,这完全破坏了它是异步的想法。该功能甚至存在的事实是 Android 中的设计缺陷。相反,在 AsyncTask
完成后需要完成的任何事情都应该在任务的 onPostExecute()
中完成(或在从那里调用的函数中完成)。
显然这是你的问题 - 你没有关闭对话框并并行执行任务,你正在等待任务完成(记住 UI
在控制权返回之前不会更新UI 线程循环器)。
您必须使用这些更改
dialog.dismiss();
代替
dialog.cancel();