2013-03-03 21 views
0

我環顧四周,但我不太清楚這是如何工作的,唯一真正接近我所尋找的線索有404條信息。更改用戶界面的定時事件?

在一項活動中,我列出了四張圖片。我希望他們每15秒更換一張不同的圖像,然後我會跟蹤哪些圖像在那裏,讓他們鏈接到另一個活動。我有線程工作和張貼到System.out.println(),但用戶界面沒有改變,我不知道如何允許它。這是迄今爲止我所擁有的。

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

回答

0

好吧,我居然發現我一直在尋找的答案在我的一本書中 - Android Recipes。這是誰這個問題以後可能會發現:

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

} 
+0

OK我試圖改變swapImages到這一點,但我把代碼handleUpdates()的run()函數。還是不行。它會發布到控制檯,但不會更新UI。 – 2013-03-03 00:29:24

0

線程不會在UI線程上運行,因此UI更新會出現工作,但不會出現在屏幕上。

this Android Developer blog post並在Android guides,您可以使用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(); 
+0

Hrm,這裏同樣的問題。它將運行println,但不更新線程。我把你的代碼放到我的onCreate()函數中。 – 2013-03-03 00:41:26