0

私は周りを見回しましたが、これがどのように機能するかはよくわかりません。私が探しているものに本当に近い唯一のスレッドには、404の情報がありました。

アクティビティでは、4つの画像をレイアウトしています。15秒ごとに別の画像に変更してもらい、別のアクティビティにリンクできるように、どの画像がそこにあるかを追跡します。スレッドが機能して投稿してSystem.out.println()いますが、UIが変更されておらず、許可する方法がわかりません。これが私がこれまでに持っているものです。

public int curImage1 = 1;
public int curImage2 = 2;
public int curImage3 = 3;
public int curImage4 = 4;

onCreate()方法:

// ...
imagesHandler = new Handler();
startImageSwapping();

Runnable swapImages = new Runnable() {

    @Override
    public void run() {
        handleUpdates();
        imagesHandler.postDelayed(swapImages, 3000);
    }
};

public void handleUpdates() {
    if (curImage1 == 1) {
        ((ImageView) findViewById(R.id.main_image_1)).setImageDrawable(
                getResources().getDrawable(R.drawable.logo));
        curImage1 = 5;
    }
    if (curImage1 == 5) {
        ((ImageView) findViewById(R.id.main_image_1)).setImageDrawable(
                getResources().getDrawable(R.drawable.main_image_1));
        curImage1 = 1;
    }
    System.out.println("TEST");
}

public void startImageSwapping() {
    imageThreadIsRunning = true;
    swapImages.run();
}

public void stopImageSwapping() {
    imagesHandler.removeCallbacks(swapImages);
    imageThreadIsRunning = false;
}

変更を適用した後の現在のコード。まだそれをしていませんが、それに遭遇した他の人のためにこの投稿を更新し続けたいと思います。

Runnable swapImages = new Runnable() {

    @Override
    public void run() {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                if (curImage1 == 1) {
                    ((ImageView) findViewById(R.id.main_image_1)).setImageDrawable(
                            getResources().getDrawable(R.drawable.logo));
                    curImage1 = 5;
                }
                if (curImage1 == 5) {
                    ((ImageView) findViewById(R.id.main_image_1)).setImageDrawable(
                            getResources().getDrawable(R.drawable.main_image_1));
                    curImage1 = 1;
                }
                System.out.println("TEST");
            }
        });
        imagesHandler.postDelayed(swapImages, 3000);
    }
};

public void startImageSwapping() {
    imageThreadIsRunning = true;
    swapImages.run();
}

public void stopImageSwapping() {
    imagesHandler.removeCallbacks(swapImages);
    imageThreadIsRunning = false;
}

@Override
protected void onDestroy() {
    stopImageSwapping();
    super.onDestroy();
}

@Override
protected void onPause() {
    stopImageSwapping();
    super.onPause();
}

@Override
protected void onStop() {
    stopImageSwapping();
    super.onStop();
}

@Override
protected void onStart() {
    if (!imageThreadIsRunning)
        startImageSwapping();
    super.onStart();
}

@Override
protected void onResume() {
    if (!imageThreadIsRunning)
        startImageSwapping();
        super.onResume();
}
4

3 に答える 3

0

さて、私は実際に私の本の1つであるAndroidレシピで探していた答えを見つけました。これは、後でこの質問を見つける可能性のある人のためのものです。

private Runnable timerTask = new Runnable()
{
    @Override
    public void run()
    {
        if(curImage1 == 1)
        {
            mainImage1.setImageDrawable(getResources().getDrawable(R.drawable.logo));
            curImage1 = 5;
        }
        else if(curImage1 == 5)
        {
            mainImage1.setImageDrawable(getResources().getDrawable(R.drawable.main_image_1));
            curImage1 = 1;
        }
        mHandler.postDelayed(timerTask, 3000);
    }
};

@Override
public void onResume()
{
    super.onResume();
    mHandler.post(timerTask);
}

@Override
public void onPause()
{
    super.onPause();
    mHandler.removeCallbacks(timerTask);
}
于 2013-03-03T00:54:28.153 に答える
0

使用する場合runOnUiThread

Runnable swapImages = new Runnable()
{
    @Override
    public void run()
    {
            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                     handleUpdates();
                 }
            });
            imagesHandler.postDelayed(swapImages, 3000);
    }
};

編集:

申し訳ありませんが、あなたのコードは私をかなり混乱させます。私が最初からそれを書くなら、私はそれを次のようにします:

public class Whatever extends Activity implements Runnable {
    ImageView iv;
    Switcher switcher;
    Thread thread;
    Handler handler = new Handler();
    public int curImage ;
    public final int curImage1 = 1;
    public final int curImage2 = 2;
    public final int curImage3 = 3;
    public final int curImage4 = 4;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        iv = (ImageView) findViewById(R.id.imageLogoDown);
        iv.setImageResourse(R.drawable.main_image_1);
            curImage = curImage1;

            switcher = new Switcher(this, handler);
        }



    /**
     * This class will implement the timer, calling run() on the UI thread each
     * time the timer elapses.
     */
    public class Switcher implements Runnable {
        private boolean _running = true;
        private Handler _handler;
        private Runnable _runnable;

        public Switcher(Runnable runnable, Handler handler) {
            _runnable = runnable;
            _handler = handler;
        }

        public void setRunning(boolean running) {
             _running = running;
        }

        @Override
        public void run() {
            while (_running) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException ex) {
                }
                if (_running)
                    _handler.post(_runnable);
            }
        }
    }

    /**
     * Now on UI thread. Switch views.
     */
    @Override
    public void run() {
        switch (curImage) {
        case curImage1  :
            iv.setImageResourse(R.drawable.main_image_2);
            curImage = curImage2 ;
            break;
        case curImage2 :
            iv.setImageResource(R.drawable.main_image_3);
            curImage = curImage3 ;
            break;
        case curImage3 :
            iv.setImageResource(R.drawable.main_image_4);
            curImage = curImage4 ;
            break;
        case curImage4 :
            iv.setImageResource(R.drawable.main_image_1);
            curImage = curImage1 ;
            break;
        }
    }
  }

}
于 2013-03-03T00:13:50.463 に答える
0

スレッドは UI スレッドで実行されないため、UI の更新は機能しているように見えますが、画面には表示されません。

この Android 開発者ブログの投稿 およびAndroid ガイドに従って、 runOnUiThreadメソッドを使用するか、便利なクラスCountDownTimerを使用することができ、スレッド化をまったく行う必要はありません。

CountDownTimer timer = new CountDownTimer(15000, // 15 second countdown
    99999) // onTick time, not used here
{

     public void onTick(long millisUntilFinished) {
         // Not used in this example
     }

     public void onFinish() {
         handleUpdates();
         timer.start(); // restarts the timer
     }
};
timer.start();
于 2013-03-03T00:31:34.850 に答える