0

我想展示来自互联网流的位图图像。每 500 毫秒我得到一个新图像,我想把这个图像呈现给用户。做这个的最好方式是什么?我可以使用图像视图并每 500 毫秒更改一次图像吗?

我尝试在这样的计时器任务中执行此操作:

    timer.schedule(new TimerTask() {
        public void run() {
            if(flag){
                Bitmap bmp = null;
                Log.i(APPID, "New frame");
                try {
                    bmp = session.getImage();
                    setImage(bmp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                timer.cancel();
            }
        }
    }, 500, 500);

但这不起作用。

4

2 回答 2

1

定时器任务在不同的线程上运行。您需要在 ui 线程上更新 ui。您应该使用runOnUiThreadHandler

 runOnUiThread(new Runnable() //run on ui threa
 {
         public void run() 
         { 
                // update ui here   
         }
  });

处理程序

   Handler m_handler;
   Runnable m_handlerTask ; 

   m_handler= new Handler();  
   m_handlerTask = new Runnable()
           {
               @Override 
               public void run() { 
                    // do soemthing 

                    m_handler.postDelayed(m_handlerTask, 1000);    
                            // change 1000 to whatever you want 

               }
          };
          m_handlerTask.run(); 

当你想取消调用这个m_handler.removeCallbacks(m_handlerTask)

于 2013-06-19T08:50:11.577 回答
1

从 UI/主线程以外的线程更新 UI 将失败,因为 Android 不允许这样做。尝试使用处理程序将消息发布回 UI 线程。你可以做这样的事情。

final Handler h = new Handler();
timer.schedule(new TimerTask() {
    public void run() {
        if(flag){
            h.post(new Runnable() {
                public void run() {
                    Bitmap bmp = null;
                    Log.i(APPID, "New frame");
                    try {
                       bmp = session.getImage();
                       setImage(bmp);   
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
            }
        } else {
            timer.cancel();
        }
    }
}, 500, 500);
于 2013-06-19T08:48:54.060 回答