[英]Updating Multiple Textbox Java GUI
我有一個活動或表單,其中有一個稱為時間的文本框。 正如該論壇的專家建議的那樣,我在從wifi接收數據時使用runnable更新TextBox。
我的疑問是當我想更新多個TextBox時該怎么做。 我應該使用多個可運行對象塊嗎
time1.post(new Runnable() {
@Override
public void run() {
time2.setText(s1);
}
});
time2.post(new Runnable() {
@Override
public void run() {
time2.setText(s2);
}
});
time3.post(new Runnable() {
@Override
public void run() {
time3.setText(s2);
}
});
還是有其他技術可以更新多個TextBox? 我現在的代碼如下。
package com.example.cdttiming;
public class MainActivity extends Activity
{
EditText time;
String s;
Button button;
byte[] buffer = new byte[65535];
InetAddress ia = null;
byte[] bmessage = new byte[1500];
DatagramPacket dp = new DatagramPacket(bmessage, bmessage.length);
MulticastSocket ms = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
time = (EditText) findViewById(R.id.et_time);
try
{
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
ia = InetAddress.getByName("226.1.1.1");
try {
ms = new MulticastSocket(4321);
} catch (IOException e) {
e.printStackTrace();
}
try {
ms.joinGroup(ia);
} catch (IOException e) {
e.printStackTrace();
}
ms.setReuseAddress(true);
}
catch (UnknownHostException e) {
time.setText(e.getMessage());
}
catch (IOException e) {
time.setText(e.getMessage());
}
}
public void startProgress(View view) {
Runnable runnable = new Runnable() {
@Override
public void run() {
while(true) {
try {
// String str="This is test string";
ms.receive(dp);
s = new String(dp.getData(),0,dp.getLength());
char retval[] = s.toCharArray();
}
catch (UnknownHostException e) {
time.setText(e.getMessage());
}
catch (IOException e) {
time.setText(e.getMessage());
}
****////// My doubt is here if i have multple strings of data and multiple
/// multiple textboxes to update then what to do ???****
time.post(new Runnable() {
@Override
public void run() {
time.setText(s);
}
});
} // while
}
};
new Thread(runnable).start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
我建議您只創建一個可運行對象,並將其發布到主線程上一次,如下所示:
time1.post(new Runnable() {
@Override
public void run() {
time2.setText(s1);
time2.setText(s2);
time3.setText(s3);
}
});
創建可運行對象並將其發布到視圖的主線程處理程序中的需要僅是關於在UI線程上運行一段代碼。 無論您從何處獲取主線程處理程序引用。
您也可以在主線程上創建how處理程序:
protected void onCreate(Bundle savedInstanceState)
{
this.uiThrdHandler = new Handler();
}
然后使用它發布一個可運行的:
this.uiThrdHandler.post(new Runnable(){
...
});
當然,無需創建其他處理程序,但這只是出於演示目的。
Activity對象具有用於該目的的實用程序方法: runOnUiThread
使用它,它將是:
MainActivity.this.runOnUiThread (new Runnable() {
@Override
public void run() {
time2.setText(s1);
time2.setText(s2);
time3.setText(s3);
}
});
但是同樣,結果是一樣的。
您的代碼有點混亂。 在主內一個案例while循環要捕獲的數據,將其分配給一個字符串變量s然后使用文本組件后()函數和一個Runnable到的EditText小部件設置為該值。 但是在同一個while循環中,您具有異常處理程序,它們可以直接直接設置相同的EditText小部件。 如果while循環在計時器循環有機會觸發設置的文本調用之前重置s的值,您的代碼也看起來可能會丟失消息。
看來您正在嘗試創建某種形式的實時系統,並且需要主while循環來連續處理並在可用時顯示數據。 現在,您有3個不同的使用者(文本小部件),但是您沒有提到是否還有3個不同的消息源,還是仍然只有一個主處理循環,並且某種形式的選擇器將決定哪個文本小部件獲取消息?
如果我按照這些思路進行構建,可能會使用消息傳遞系統並遵循生產者-消費者模型。 當接收到文本時,我將使主要處理循環將一個簡單的2字段消息推送到隊列中,該隊列包含對文本小部件的引用和對數據字符串的引用。 因為字符串在Java中是不可變的,所以一旦消息對象擁有自己的文本副本,對s的任何更改都不會影響消息。
然后,我將在后台運行另一個消耗消息隊列的線程。 它將使消息脫離隊列,使用消息數據構造對目標文本小部件的后調用,將其觸發,然后返回以獲取下一條消息。
通過這種方法,您可以將數據處理線程與UI更新處理分開,而無需擔心需要更新多少個文本小部件或其他小部件。 如果您需要添加其他組件,則只需擔心創建更新消息的代碼會知道新的窗口小部件。 進行小部件更新的線程不知道您有多少個小部件,它僅使用消息創建者所說的在更新消息對象中引用的小部件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.