2010-03-03 67 views
3

我试图阻止我的应用程序在双击事件中调用同一方法两次,或者用户几乎同时快速按下不同的按钮。Android:停止方法被调用两次,如果已经运行

我有点击视图,作为按钮,调用相同的方法,但传递不同的参数。这是呼叫:

startTheSearch(context, getState(), what, where); 

在此方法中,我创建一个新的线程,因为它将查询结果的Web服务器:

new Thread(new Runnable() { 

public void run() { 

    progDiag = ProgressDialog.show(ctx, null, "Searching", true); 
    getServerXML(context, what, where, searchIsCustom, mOffset); 
     handler.sendEmptyMessage(0); 
} 
}).start(); 

的问题是,在两个快速点击时,方法被激发两次,两个线程被创建,因此创建了两个新的活动。这使我的应用程序崩溃。

当方法完成后,我们有来自服务器的结果,我们所说的处理程序:

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); 
} 

} 
}; 

我想有称为全局布尔变量“封锁”最初设置为false,创建条件,如:

if(!blocked){ 
blocked = true; 

new Thread(new Runnable() { 
    public void run() { 

但这似乎只是速度较慢的手机上工作,如G1,我试图在Nexus,并将其设置阻塞= TRUE之前,第二请求已经获得了批准。那么有没有什么办法阻止被调用的方法,如果它已经运行,或者如果线程已经启动,所以它不会创建一个新的?

回答

1

而不是使用“阻塞”布尔,你可能会调查使用互斥。他们是为这种问题而设计的。

1

我试图Nexus和之前将其设置 阻塞=真,第二请求已经 授予

那是不可能的。 Android UI是单线程的。没有办法同时调用OnClickListeners的两个onClick()方法。

2

在书籍Hello Android中,作者Ed Burnette为这个问题提供了一个很好的解决方案。 要让您的应用快速响应,您应该创建第二个线程来执行Web请求。

您可以使用SingleThreadExecutor来代替为每个请求创建新线程。如果你启动第二个线程,你可以检查你是否正在等待另一个线程的结果并阻塞,直到这个线程就绪,或者如果你认为用户现在想做其他事情,就取消旧线程并开始一个新线程。

你可以从这本书的page找到源代码。在源代码中查找Translate文件夹。这是一个很好的例子,说明如何对用户命令做出反应,以及如何防止用户因触摸gui而触及太多的web请求。

相关问题