我试图阻止我的应用程序在双击或用户几乎同时快速按下不同按钮时调用同一方法两次。
我有可点击的 View ,充当按钮,它们调用相同的方法但传递不同的参数。这是调用:
startTheSearch(context, getState(), what, where);
在这个方法中,我创建了一个新线程,因为它向网络服务器查询结果:
new Thread(new Runnable() {
public void run() {
progDiag = ProgressDialog.show(ctx, null, "Searching", true);
getServerXML(context, what, where, searchIsCustom, mOffset);
handler.sendEmptyMessage(0);
}
}).start();
问题是快速点击两次后,该方法被触发两次,创建了两个线程,因此创建了两个新 Activity 。这使我的应用程序崩溃。
当方法完成后,我们从服务器得到结果,我们调用处理程序:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
try {
Intent i = new Intent(Golf.this, Result.class);
Bundle b = new Bundle();
b.putString("what", mWhat);
b.putString("where", mWhere);
b.putInt("offset", mOffset);
b.putBoolean("searchIsCustom", searchIsCustom);
i.putExtras(b);
startActivityForResult(i, Activity.RESULT_OK);
progDiag.dismiss();
} catch (Exception e) {
Alerts.generalDialogAlert("Error", "settings", ctx);
}
}
};
我试图将一个名为“blocked”的全局 bool 变量初始设置为 false,创建如下条件:
if(!blocked){
blocked = true;
new Thread(new Runnable() {
public void run() {
但这似乎只适用于 G1 等较慢的手机,我在 Nexus 上试过,在它设置 blocked = true 之前,第二个请求已被批准。那么有什么方法可以阻止正在运行的方法,或者如果线程已经启动所以它不会创建新的方法?
最佳答案
在 Hello Android 一书中,作者 Ed Burnette 为这个问题提供了一个非常好的解决方案。 为了让您的应用程序保持快速和响应,您应该创建第二个线程来执行网络请求。
您可以使用 SingleThreadExecutor 而不是为每个请求创建一个新线程.如果您启动第二个线程,您可以检查您是否正在等待另一个线程的结果并阻塞直到该线程准备就绪,或者如果您认为用户现在想要做其他事情,则取消旧线程并启动一个新线程.
你可以在这个page上找到书中的源代码.在源代码中查找 Translate 文件夹。这是一个很好的示例,说明如何对用户命令使用react以及如何防止由于用户在 gui 上进行大量操作而导致过多的 Web 请求。
关于Android:如果已经运行,则停止方法被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375925/