這是我的代碼。(實際上是從開源復制的)
package com.example.realtest;
import android.content.Context;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class MainActivity extends AppCompatActivity {
public TextView Toptext;
public Button StartButton;
public Button StopButton;
public Button ConnButton;
private Socket socket;
public TextView temphum;
// fixme: TAG
String TAG = "socketTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
temphum = (TextView)findViewById(R.id.temphum);
ConnButton = findViewById(R.id.button1);
StartButton = findViewById(R.id.button2);
StopButton = findViewById(R.id.button3);
final EditText ipNumber = findViewById(R.id.ipText);
Log.i(TAG, "Application createad");
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT > 8) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
ConnButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(), "Connect ??", Toast.LENGTH_SHORT).show();
String addr = ipNumber.getText().toString().trim();
ConnectThread thread = new ConnectThread(addr);
//??? ?? ???
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(ipNumber.getWindowToken(), 0);
thread.start();
}
});
// fixme: ?? ClickListener
StartButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View view) {
StartThread sthread = new StartThread();
StartButton.setEnabled(false);
StopButton.setEnabled(true);
sthread.start();
}
});
StopButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View view) {
StopThread spthread = new StopThread();
StartButton.setEnabled(true);
StopButton.setEnabled(false);
spthread.start();
}
});
}
// fixme: Start ?? ?? ? ??? ?/??.
class StartThread extends Thread{
int bytes;
public StartThread(){
}
public void run(){
// ??? ??
try {
Log.d(TAG, "??? ?? ??");
//TODO:?? ???(????) ??
while (true) {
byte[] buffer = new byte[64];
InputStream input = socket.getInputStream();
bytes = input.read(buffer);
String sensor = new String(buffer);
Log.d(TAG, "data = " sensor);
}
}catch(IOException e){
e.printStackTrace();
Log.e(TAG,"?? ??");
}
}
}
// fixme: Stop ?? ?? ? ??? ??.
class StopThread extends Thread{
public StopThread(){
}
public void run(){
// ??? ??
try {
String OutData = "AT STOP\n";
byte[] data = OutData.getBytes();
OutputStream output = socket.getOutputStream();
output.write(data);
Log.d(TAG, "AT STOP\\n COMMAND ??");
} catch (IOException e) {
e.printStackTrace();
}
}
}
// fixme: Socket Connect.
class ConnectThread extends Thread {
String hostname;
public ConnectThread(String addr) {
hostname = addr;
}
public void run() {
try { //????? ?? ??
int port = 9999;
socket = new Socket(hostname, port);
Log.d(TAG, "Socket ??, ??.");
Toptext = findViewById(R.id.text1);
runOnUiThread(new Runnable() {
@Override
public void run() {
InetAddress addr = socket.getInetAddress();
String tmp = addr.getHostAddress();
Toptext.setText(tmp " ?? ??");
Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_LONG).show();
ConnButton.setEnabled(false);
StartButton.setEnabled(true);
}
});
} catch (UnknownHostException uhe) { // ?? ?? ? ???? ???(www.unknown-host.com)? IP? ??? ? ??.
Log.e(TAG, " ?? Error : ???? IP ??? ??? ? ??.(??? ?? ? ?? ??? ?? ??)");
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Error : ???? IP ??? ??? ? ??.(??? ?? ? ?? ??? ?? ??)", Toast.LENGTH_SHORT).show();
Toptext.setText("Error : ???? IP ??? ??? ? ??.(??? ?? ? ?? ??? ?? ??)");
}
});
} catch (IOException ioe) { // ?? ?? ???? I/O ?? ??.
Log.e(TAG, " ?? Error : ???? ?? ??");
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Error : ???? ?? ??", Toast.LENGTH_SHORT).show();
Toptext.setText("???? ?? ??");
}
});
} catch (SecurityException se) { // security manager?? ???? ?? ?? ??.
Log.e(TAG, " ?? Error : ??(Security) ??? ?? ?? ???(Security Manager)? ?? ??. (???(proxy) ?? ??, ???? ?? ?? ??)");
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Error : ??(Security) ??? ?? ?? ???(Security Manager)? ?? ??. (???(proxy) ?? ??, ???? ?? ?? ??)", Toast.LENGTH_SHORT).show();
Toptext.setText("Error : ??(Security) ??? ?? ?? ???(Security Manager)? ?? ??. (???(proxy) ?? ??, ???? ?? ?? ??)");
}
});
} catch (IllegalArgumentException le) { // ?? ?? ? ???? ?? ??(65536)? ?? ??(0~65535)? ???.
Log.e(TAG, " ?? Error : ???? ??? ????? ???? ?? ??.(0~65535 ?? ?? ?? ?? ??, null ???(proxy) ??)");
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), " Error : ???? ??? ????? ???? ?? ??.(0~65535 ?? ?? ?? ?? ??, null ???(proxy) ??)", Toast.LENGTH_SHORT).show();
Toptext.setText("Error : ???? ??? ????? ???? ?? ??.(0~65535 ?? ?? ?? ?? ??, null ???(proxy) ??)");
}
});
}
}
}
@Override
protected void onStop() { //? ???
super.onStop();
try {
socket.close(); //??? ???.
} catch (IOException e) {
e.printStackTrace();
}
}
}
此代碼每 30 秒從 raspberrypi 接收溫度和濕度資料(如“溫度:27 攝氏度,濕度 40%”)。
我想在 textview 上顯示這些資料,所以我添加了 textview(temphum) 并用于temphum.setText("data = " sensor);在這部分用傳感器資料填充 textview
while (true) {
byte[] buffer = new byte[64];
InputStream input = socket.getInputStream();
bytes = input.read(buffer);
String sensor = new String(buffer);
Log.d(TAG, "data = " sensor);
temphum.setText("data = " sensor);
}
但是當我運行此代碼時,發生錯誤。
我想是因為我temphum.setText("data = " sensor);在while(true),java 中使用過感到困惑。
我想我應該考慮 textview 中剩余的傳感器資料,因為它每 30 秒接收一次新資料。(洗掉它或重繪 接收部分或以某種方式..)
實際上我是一個編碼新手,我不知道如何使這段代碼運行良好。
請幫幫我。
uj5u.com熱心網友回復:
讓我們開始
if (SDK_INT > 8) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
永遠不要這樣做。這樣做是允許各種實際上是非法的行為,并且可能會破壞您的程式。如果沒有這些行,您的程式會立即崩潰并告訴您您做錯了什么。有了這些線,你就會看到這一點。
事實上,我會更進一步——任何使用此代碼的站點或來源都不應該被信任。使用另一個地方來學習。他們最多只會教你壞習慣。
您的資料未顯示的原因是您不能在主執行緒以外的任何執行緒上更改 UI 元素。它不起作用。通常你會遇到一個崩潰,告訴你這個,但是通過關閉嚴格模式你讓它運行 - 它實際上不會作業。為此,請將訊息發布到 UI 執行緒上的處理程式并在那里呼叫 setText。并洗掉嚴格模式設定,以便將來您的程式正確地警告您類似的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314952.html
