【问题标题】:Android: Stopping method to be called twice if already runningAndroid:如果已经运行,将调用两次停止方法
【发布时间】:2010-03-03 23:46:18
【问题描述】:

我试图防止我的应用程序在双击时调用相同的方法两次,或者如果用户几乎同时快速按下不同的按钮。

我有可点击的视图,充当按钮,调用相同的方法但传递不同的参数。这是电话:

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

}
};

我尝试将一个名为“blocked”的全局布尔变量最初设置为 false,从而创建如下条件:

if(!blocked){
 blocked = true;

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

但这似乎只适用于 G1 等速度较慢的手机,我在 Nexus 上尝试过,在它设置阻塞 = true 之前,第二个请求已被批准。那么有什么方法可以阻止正在调用的方法,如果它已经在运行,或者如果线程已经启动,所以它不会创建一个新的?

【问题讨论】:

    标签: android multithreading methods


    【解决方案1】:

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

    您可以使用SingleThreadExecutor,而不是为每个请求创建一个新线程。如果您启动第二个线程,您可以检查您是否正在等待另一个线程的结果并阻塞直到该线程准备好,或者如果您认为用户现在想要做其他事情,则取消旧线程并启动一个新线程.

    您可以在page 上找到本书的源代码。在源代码中查找 Translate 文件夹。这是一个很好的例子,说明如何对用户命令做出反应,以及如何防止由于用户在 gui 上触摸很多而导致过多的 Web 请求。

    【讨论】:

      【解决方案2】:

      您可以使用互斥体进行调查,而不是使用“阻塞”布尔值。它们专为此类问题而设计。

      【讨论】:

        【解决方案3】:

        我在 Nexus 上尝试过,在它设置之前 阻塞=真,第二个请求有 被授予了

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-31
          • 1970-01-01
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 1970-01-01
          • 2012-09-12
          • 1970-01-01
          相关资源
          最近更新 更多