0

ボタンを押すと、アプリケーションはサーバーにデータを送信しようとします。接続がアクティブな場合、データはすぐに送信されますが、リンクがダウンしている場合、システムは 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;
    }
 }

また、他のボタン リスナーでは次のようになります。

ありがとう

4

2 に答える 2

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)に可視性を VISIBLE に設定します。

于 2013-06-05T20:16:30.173 に答える
1

boolean = true;データの処理中に設定されたフラグを使用するだけです。次にButtononClick

public void onClick(View v)
{
     if (!sending)
     {
         // do stuff
     }
}

である場合sendingは何もtrueButtonません。データなどの処理が終わったら、必ずflagbackを設定してください。falsebuttonName.setEnabled(false); を使用することもできます。then back toあなたが終わった後にtrue`の後。

補足:この操作に非常に長い時間がかかる場合 (おそらく 1 秒または 2 秒以上) は、人々が非常にせっかちな生き物になっているため、彼らに何もさせないように思いとどまらせます。座って回転する円を数秒間見たいと思う人はいません。ただし、これを行うことを選択した場合は、何らかのメッセージを表示して、機能しButtonsない理由を知らせることができます。

于 2013-06-05T20:11:28.880 に答える