2013-03-03 64 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