我是執行緒概念的新手。我正在android中進行套接字編程。我想以各種方法使用我從客戶端收到的訊息。但是我無法訪問來自 Runnable 介面的 run() 方法的訊息。下面是我的代碼
'''
class Thread1 implements Runnable {
@Override
public void run() {
Socket socket;
while (true) {
try {
serverSocket = new ServerSocket(SERVER_PORT);
socket = serverSocket.accept();
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = input.readLine();
if (message != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvMessages.setText("" message "\n");
}
});
} else {
return;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
'''
這里我想在不同的類或方法中使用訊息變數。
uj5u.com熱心網友回復:
您可以簡單地在您的活動中創建一個處理程式物件,例如Handler activtyHandler = new Handler()接下來將此處理程式傳遞給您正在創建的執行緒物件,然后發布您想要在活動上運行的任何代碼,如下所示
mHandler.post(new Runnable() {
@Override
public void run() {
tvMessages.setText("" message "\n");
}
});
uj5u.com熱心網友回復:
對于您的特定代碼,將訊息變數設為 final:
final String message = input.readLine();
作為旁注,tvMessages來自哪里?顯然是一個TextView,但是它是如何到達類實作的呢?您應該將tvMessages更改為WeakReference而不是強參考,因為在您的代碼中使用它可能會產生 Activity 背景關系泄漏。
另外,雖然問題中沒有問到,與其每次收到訊息都創建一個新的runnable,不如在創建作業執行緒之前先創建一個系結到主執行緒的Handler,然后用它來發送訊息到用戶界面。這將避免許多不必要的可運行實體。
uj5u.com熱心網友回復:
不是 100% 確定問題是什么,但也許您錯過了final關鍵字?例如以下作業。
final String message = "hello";
runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("" message "\n");
}
});
如果沒有final,您應該會收到以下錯誤:
Cannot refer to the non-final local variable message defined in an
enclosing scope
您還可以創建帶有欄位的類:
static class MyRunnable implements Runnable {
private final String message;
public MyRunnable(String message) {
this.message = message;
}
@Override
public void run() {
System.out.println("" message "\n");
}
}
那么你會像這樣使用它:
final String message = "hello";
runOnUiThread(new MyRunnable(message));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399900.html
上一篇:確保JSR223后處理器中的vars.get將僅在當前執行緒中設定值
下一篇:如何正確使用佇列和執行緒
