Android:丢弃点击按钮后感知的事件

时间:2013-06-05 20:08:00

标签: android events button event-handling

只需按一下按钮,应用程序就会尝试将数据发送到服务器。如果连接处于活动状态,则会立即发送数据,但如果链接已关闭,则系统会尝试发送x秒。实际上,在那段时间内,界面(有意)被阻挡(按钮被点亮以突出显示当前操作)。问题是,如果用户开始按其他按钮,则会听到事件,当连接变为活动状态时,它会执行与这些事件相关的所有操作。
我该如何预防呢? 如何防止如何防止与其他按钮相关的每个事件被处理? 任何建议都将非常感激。

修改 我已经尝试在按下按钮时检查标志,不幸的是,当重新设置标志时,所有事件都被捕获并执行:

public void onClick(View v) {                   
    switch(v.getId())
    {

    case R.id.button1:  //when sendData() is trying to send the message, I don't want to that this code is executed
       if(flagConf  == 1)  
       {
                ...do something...
       }
       break;
    case R.id.buttonConfirm:

        if(myFlag  == 1)    //to avoid multiple touch of this button
        {
            ...do something...
            myFlag = 0;
            sendData(); 
            if(dataSent)     
             ...do something...
            else
            ...do something...
            myFlag = 1;  //I set this flag to 1 because, if message is not sent, the user have to re-pressed the buttonConfirm and try again
        }     
     break;
    }
 }

在其他按钮监听器上:

由于

2 个答案:

答案 0 :(得分:1)

您可以在处理数据时使用设置为boolean = true;之类的标记。然后检查Button

中的每个onClick
public void onClick(View v)
{
     if (!sending)
     {
         // do stuff
     }
}

如果sendingtrue,则Button将不执行任何操作。处理完数据或其他任何内容后,请务必将flag设置回false。完成后,您还可以使用buttonName.setEnabled(false); then back to true`。

旁注:如果此操作需要很长时间(可能超过一两秒),我会反对不允许他们做任何事情,因为人们变得非常不耐烦的生物。没有人愿意坐下来看一个旋转的圆圈几秒钟。但是,如果您选择这样做,那么您可能希望显示一些消息,以便他们知道Buttons无效的原因

答案 1 :(得分:1)

我有类似的问题。并且有一种很好的解决方法。

我与服务器的连接是通过扩展AsyncTask的类完成的。这样,每次按下按钮,我都会检查任务是否正在运行。如果不是,它将生成一个新任务并执行该任务。

public void onClick(View v) {
    if (updateThread == null){

        updateThread = new UpdateThreadClass();
        updateThread.execute();
    }
}

然后创建AsyncTask,如:

   public class UpdateThreadsClass extends AsyncTask<String, Void, Boolean> {
    @Override
    protected Boolean doInBackground(String... params) {

        // Your code
    }

    @Override
    protected void onPostExecute(final Boolean success) {

        // Execute after completing the connection
    }
}

将变量updateThread声明为全局变量然后你的好处。

如果需要,您可以通过更改任务前后的可见性(XML.setVisibility(View.VISIBLE)内的.setVisibility(View.Gone)onClick)激活XML上的进度条已完成,或者您也可以为按钮执行相同操作。

修改

您可以将进度条放在<ProgressBar android:id="@+id/loading_screen" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:gravity="center_vertical|center_horizontal" android:visibility="gone"/> 中,如下所示:

loadingScreen = (ProgressBar) findViewById(R.id.loading_screen)

然后点击按钮后,只需按{{1}}并设置可见性可见。