Справка для новичков в Android с пользовательским интерфейсом Thread - PullRequest
0 голосов
/ 23 апреля 2011

Я пытаюсь сделать 4 изображения невидимыми и видимыми через определенный промежуток времени, что-то вроде синего изображения, синего изображения, желтого изображения, желтого изображения. Я хочу сделать это без событий, только с циклом for. Я пытаюсь следующее, но это не работает. Я новичок в Android и графики. Пожалуйста, помогите мне

public class GameActivity extends Activity {    
/** Called when the activity is first created. */
private Handler mHandler = new Handler();
ImageView[] imViews = new ImageView[4];
ImageView imageView1;
ImageView imageView2;
ImageView imageView3;
ImageView imageView4;

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);

    setContentView(R.layout.myviewlay);
    imageView1= (ImageView)findViewById(R.id.ImageView01);
    imageView2= (ImageView)findViewById(R.id.ImageView02);
    imageView3= (ImageView)findViewById(R.id.ImageView03);
    imageView4= (ImageView)findViewById(R.id.ImageView04);


    final ImageView[] imViews = new ImageView[4];
    imViews[0] = imageView1;
    imViews[1] = imageView2;
    imViews[2] = imageView3;
    imViews[3] = imageView4;

    mHandler.removeCallbacks(mUpdateTimeTask);                         
    mHandler.postDelayed(mUpdateTimeTask, 100); 

}

private Runnable mUpdateTimeTask = new Runnable() {  
     public void run() {   

         for(int i=0; i < 5; i++)
         {
              imViews[i].setVisibility(View.INVISIBLE);
              mHandler.postDelayed(this, 1000); 
              imViews[i].setVisibility(View.INVISIBLE);
              mHandler.postDelayed(this, 1000); 
         }

         }};   
}

Мой журнал ошибок:

04-23 05:25:16.383: ERROR/AndroidRuntime(506): java.lang.NullPointerException
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at com.games.game.GameActivity$1.run(GameActivity.java:60)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at android.os.Handler.handleCallback(Handler.java:587)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at android.os.Looper.loop(Looper.java:123)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at android.app.ActivityThread.main(ActivityThread.java:3647)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at java.lang.reflect.Method.invokeNative(Native Method)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at java.lang.reflect.Method.invoke(Method.java:507)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-23 05:25:16.383: ERROR/AndroidRuntime(506):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

Вы не можете достичь этого, используя postDelayed (), как вы это сделали. Метод не будет приостанавливать ваш метод в цикле. Это может быть достигнуто с помощью Thread.sleep (). Однако выполнение этого в потоке пользовательского интерфейса в конечном итоге приведет к принудительному закрытию, поскольку вы будете блокировать поток пользовательского интерфейса слишком долго.

По сути, вам нужен какой-то фоновый поток, ожидающий вас, который затем публикует исполняемый файл в вашем потоке пользовательского интерфейса, показывая / скрывая представления.

private Runnable mUpdateTimeTask = new Runnable() {  
 public void run() {   

     for(int i=0; i < 5; i++)
     {
          final ImageView view = imViews[i];
          mHandler.post(new Runnable() {
              public void run() {
                  view.setVisibility(View.INVISIBLE);
              }
          });
          try {
              Thread.sleep(1000);
          } catch (Exception e) {} 
          mHandler.post(new Runnable() {
              public void run() {
                  view.setVisibility(View.VISIBLE);
              }
          });              
          try {
              Thread.sleep(1000);
          } catch (Exception e) {}         
     }

     }};   
}

И в методе onCreate () запустите его с:

new Thread(mUpdateTimeTask).start();

Возможно, вы также захотите проверить класс TimerTask , который может помочь вам с периодическим запуском. Есть несколько способов сделать это.

1 голос
/ 23 апреля 2011

Попробуйте использовать:

imViews[i].setVisibility(View.GONE);

Также, как говорит @MByD, улучшите свой код, вызывая его только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...