svins wrote:

> The input events are queued. So your case is valid. When you disable a 
> button there can be already multiple events in the event queue. Sad 
> but true :( 
>
> Greenhand wrote: 
> > In my project, I has a layout as follows: 
> > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ 
> > android" 
> >     android:layout_width="fill_parent" 
> >     android:layout_height="fill_parent" 
> >     android:orientation="vertical"> 
> > 
> >     <Button 
> >         android:id="@+id/startButton" 
> >         android:layout_width="fill_parent" 
> >         android:layout_height="0dp" 
> >         android:layout_weight="1" 
> >         android:text="start" 
> >          /> 
> >     <Button 
> >         android:id="@+id/stopButton" 
> >         android:layout_width="fill_parent" 
> >         android:layout_height="0dp" 
> >         android:layout_weight="1" 
> >         android:text="stop" 
> >          /> 
> > </LinearLayout> 
> > It is quite simple. There are two buttons. One is start and the other 
> > is stop. 
> > 
> > And an Activity as follows: 
> > package button.test; 
> > 
> > import android.app.Activity; 
> > import android.os.Bundle; 
> > import android.util.Log; 
> > import android.view.View; 
> > import android.widget.Button; 
> > 
> > public class MainActivity extends Activity { 
> >         private static final String TAG = "MainActivity"; 
> >         private Button startButton; 
> >         private Button stopButton; 
> >     @Override 
> >     public void onCreate(Bundle savedInstanceState) { 
> >         super.onCreate(savedInstanceState); 
> >         setContentView(R.layout.activity_main); 
> >         startButton = (Button)findViewById(R.id.startButton); 
> >         startButton.setOnClickListener(new View.OnClickListener() { 
> > 
> >                         @Override 
> >                         public void onClick(View arg0) { 
> >                                 Log.d(TAG,"startButton isEnabled(): 
> "+arg0.isEnabled()+" executing 
> > on thread "+ Thread.currentThread().getName()); 
> >                                 if(arg0.isEnabled()==false){ 
> >                                         throw new 
> RuntimeException("startButton"); 
> >                                 } 
> >                                 arg0.setEnabled(false); 
> >                                 stopButton.setEnabled(true); 
> >                         } 
> >                 }); 
> >         stopButton = (Button)findViewById(R.id.stopButton); 
> >         stopButton.setOnClickListener(new View.OnClickListener() { 
> > 
> >                         @Override 
> >                         public void onClick(View arg0) { 
> >                                 Log.d(TAG,"stopButton isEnabled(): 
> "+arg0.isEnabled()+" executing 
> > on thread "+ Thread.currentThread().getName()); 
> >                                 if(arg0.isEnabled()==false){ 
> >                                         throw new 
> RuntimeException("stopButton"); 
> >                                 } 
> >                                 arg0.setEnabled(false); 
> >                                 startButton.setEnabled(true); 
> >                         } 
> >                 }); 
> >     } 
> > } 
> > The logic is: (1)When the start button is clicked, disable it and 
> > enable the stop button. (2)When the stop button is clicked, disable it 
> > and enable the start button. 
> > 
> > What I expect is that when the onClickListener of a button is 
> > executing, the button state should be enabled. It is impossible to 
> > fire the onClickListener when the button is disabled. Therefore, I add 
> > the if block and the RuntimeException to detect it. 
> > 
> > It works when I interact with it but it crashes when I run the monkey 
> > test (adb shell monkey -p button.test -v 50000). 
> > 
> > The logcat messages are as follows: 
> > D/MainActivity(1836): startButton isEnabled(): true main 
> > D/MainActivity(1836): stopButton isEnabled(): true main 
> > D/MainActivity(1836): startButton isEnabled(): true main 
> > D/MainActivity(1836): startButton isEnabled(): false main 
> > D/AndroidRuntime(1836): Shutting down VM 
> > W/dalvikvm(1836): threadid=1: thread exiting with uncaught exception 
> > (group=0x41745300) 
> > E/AndroidRuntime(1836): FATAL EXCEPTION: main 
> > E/AndroidRuntime(1836): java.lang.RuntimeException: startButton 
> > E/AndroidRuntime(1836):         at button.test.MainActivity 
> > $1.onClick(MainActivity.java:24) 
> > E/AndroidRuntime(1836):         at 
> android.view.View.performClick(View.java: 
> > 4084) 
> > E/AndroidRuntime(1836):         at android.view.View 
> > $PerformClick.run(View.java:16966) 
> > E/AndroidRuntime(1836):         at 
> > android.os.Handler.handleCallback(Handler.java:615) 
> > E/AndroidRuntime(1836):         at 
> > android.os.Handler.dispatchMessage(Handler.java:92) 
> > E/AndroidRuntime(1836):         at 
> android.os.Looper.loop(Looper.java:137) 
> > E/AndroidRuntime(1836):         at 
> > android.app.ActivityThread.main(ActivityThread.java:4745) 
> > E/AndroidRuntime(1836):         at 
> > java.lang.reflect.Method.invokeNative(Native Method) 
> > E/AndroidRuntime(1836):         at 
> > java.lang.reflect.Method.invoke(Method.java:511) 
> > E/AndroidRuntime(1836):         at com.android.internal.os.ZygoteInit 
> > $MethodAndArgsCaller.run(ZygoteInit.java:786) 
> > E/AndroidRuntime(1836):         at 
> > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
> > E/AndroidRuntime(1836):         at dalvik.system.NativeStart.main(Native 
> > Method) 
> > 
> > Note that at line 4, the button state is disabled when the 
> > onClickListener is executing!!! It is quite strange. In addition, both 
> > the onClickListeners are run on the main thread. 
> > What I expect is that there is no race condition between the 
> > onClickListeners because they run on the same thread. 
> > 
> > Can anyone explain why the program crashes when I run the monkey 
> > test? 
>

Adding to the other comment, the GUI is single-threaded so thread safety 
cannot be a factor.

-- 
Lew
 

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to