2012-02-06 34 views
6

Tôi cần một chút trợ giúp với việc cập nhật giao diện người dùng của mình từ Runnable/Handler mỗi giây. Tôi đang sử dụng mã này:Cập nhật Android ui từ bộ xử lý mỗi giây

Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 

         prBar.setProgress(myProgress); 
         y = (double) ((double) myProgress/ (double) RPCCommunicator.totalPackets)*100; 
         txtInfoSync1.setText(Integer.toString((int)y) + "%"); 
         prBar.setMax(RPCCommunicator.totalPackets); 

         int tmp = totalBytesReceived - timerSaved; 
         Log.w("","totalBytesReceived : "+totalBytesReceived + " timerSaved : "+timerSaved); 
         Log.w("","tmp : "+tmp); 

         if (avgSpeedCalc.size() > 10) 
         { 
          avgSpeedCalc.remove(0); 
         } 

         avgSpeedCalc.add(tmp); 

         int x = 0; 

         for (int y=0;y<avgSpeedCalc.size();y++) 
         { 
          x += avgSpeedCalc.get(y); 
          Log.d("","x : "+x); 
         } 

         x = Math.round(x/avgSpeedCalc.size()); 
         Log.e("","x : "+x); 

         timerSaved = totalBytesReceived; 
         txtSpeed.setText(Integer.toString(x)); 

        } 
       }); 
     } 
    }; 

Tôi đã thử với handler.postDelayed(runnable, 1000); trong onCreate(), nhưng Runnable bao giờ bắt đầu. Hoặc thậm chí nếu tôi thử với runnable.run();, nó vẫn không hoạt động.

Bất kỳ ý tưởng nào về cách tôi có thể bắt đầu chạy/xử lý và cập nhật ui mỗi giây?

Trả lời

24

Tại sao bạn tạo một runnable trong runnable?

Hãy thử điều này:

// flag that should be set true if handler should stop 
boolean mStopHandler = false; 

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     // do your stuff - don't create a new runnable here! 
     if (!mStopHandler) { 
      mHandler.postDelayed(this, 1000); 
     } 
    } 
}; 

// start it with: 
mHandler.post(runnable); 
+0

và làm thế nào tôi có thể ngăn chặn nó sau đó? Tôi có nghĩa là tôi cần điều này để chạy chỉ khi tôi nhận được dữ liệu qua internet và tôi muốn dừng runnable sau khi kết thúc hoạt động hoặc người dùng nhấp vào nút hủy bỏ. –

+0

cập nhật câu trả lời của tôi và giới thiệu một lá cờ – WarrenFaith

+2

Thực ra 'handler.removeCallbacks (runnable);' đang làm điều tương tự. –

1

Nếu bạn muốn cập nhật giao diện người dùng của bạn tôi nghĩ rằng đây là lựa chọn tốt nhất

new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       //Do your work 
      } 
     },500); 
+0

mã trên có thể được sử dụng để chuyển đổi giữa các trạng thái của nút chuyển đổi ..? –

Các vấn đề liên quan