2013-06-05 6 views
0

버튼을 누르면 응용 프로그램이 서버에 데이터를 보내려고합니다. 연결이 활성이면 데이터가 즉시 전송되지만 연결이 끊어지면 시스템은 x 초 동안 전송을 시도합니다. 사실, 그 시간 동안 인터페이스는 (의도적으로) 차단됩니다 (현재 작업을 강조하기 위해 버튼이 켜집니다). 문제는 사용자가 다른 버튼을 누르기 시작하면 이벤트가 들리고 연결이 활성화되면 해당 이벤트와 관련된 모든 작업을 수행한다는 것입니다.
어떻게 방지 할 수 있습니까?
해당하는 것을 방지하는 방법 다른 버튼과 관련된 각 이벤트가 처리되지 않도록하려면 어떻게해야합니까? 모든 제안은 매우 감사하겠습니다.Android : 버튼 클릭 후 인식되는 이벤트 삭제

이미 플래그 단추를 눌렀을 때 플래그가-잘 살고 다시 때, 불행하게도, 모든 이벤트 사로 잡았 및 실행 확인하기 위해 노력했습니다 편집 :

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

을 그리고 다른 버튼을 청취자 :

감사

답변

1

당신은 단순히 데이터를 처리하는 동안 boolean = true; 같은 설정되는 플래그를 사용할 수 있습니다. sending은 다음 Button는 아무것도 할 것이다 true이면 onClick

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

Button에서 확인합니다. 데이터 처리 등을 마치면 flagfalse으로 다시 설정해야합니다. buttonName.setEnabled (false)를 사용할 수도 있습니다. then back to true`를 입력하십시오.

사이드 노트 :이 작업이 매우 오래 걸리면 (어쩌면 1 초나 2 초 이상) 사람들이 매우 참을성없는 생물이되어서 아무것도하지 못하게하는 것에 반대합니다. 아무도 앉아서 몇 초 동안 회전하는 원을 바라지 않습니다. 그러나 이것을 선택하면 메시지가 표시되어 왜 Buttons이 작동하지 않는지 알 수 있습니다.

+0

불행히도 이미이 작업을 수행했지만 다른 모든 이벤트는 처리됩니다 ... 연결이 켜지면 모든 이벤트가 처리됩니다. – Ant4res

+0

Hmmm ... 코드에 다른 것이없는 한 이해가되지 않습니다. 위의 코드를'onClick' 내부에서 시도해 보았지만 코드는 여전히 실행됩니까? 이 경우에는 코드의 일부를 게시하여 진행 상황을 정확히 볼 수 있습니다. – codeMagic

+0

제 질문을 수정했습니다. 감사합니다. – Ant4res

1

비슷한 문제가있었습니다. 그리고이를 해결할 수있는 멋지고 깔끔한 방법이 있습니다.

내 서버 연결은 AsyncTask 확장 클래스를 통해 이루어졌습니다. 그렇게하면 버튼을 누를 때마다 작업이 실행되고 있는지 확인합니다. 그렇지 않은 경우 새로운 작업을 생성하고이를 실행합니다. 다음 좋은 가고 세계로 변수 updateThread를 선언

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

:

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

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

그런 다음 같은 AsyncTask를을 만들 수 있습니다.

당신이 원하는 경우

은, 당신도 전과 작업이 완료 또는 버튼에 대해 동일한 작업을 수행 할 수 있습니다 후 가시성합니다 ( onClick 내부 .setVisibility(View.VISIBLE) 또는 .setVisibility(View.Gone))을 변경하여 XML에 진보적 인 줄을 활성화 할 수 있습니다.

편집

당신은 너무처럼 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)처럼 이렇게 눈에 보이는 가시성을 설정합니다.

+0

답변 해 주셔서 감사합니다. 불행히도 AsyncTask를 사용할 수 없습니다. 사용하지 않으면 점진적 막대를 추가 할 수 있습니까? – Ant4res

+0

예, 가능합니다! 답을 편집 해 주시면 스 니펫을 추가하겠습니다. – Akatosh

+0

고마워, 나에게 매우 유용 할 것이다! – Ant4res