Я очень новичок в Android Studio.Как это первое приложение для Android, которое я когда-либо делал.И мой первый код, использующий Java, даже если это android studio java.
Моя проблема в том, что мне нужно прочитать данные из сокета udp, распечатать их в activity_main.xml и обновить action_main.xml, когда новыйданные читаются.Похоже, это не так сложно, но ни один из вопросов в Интернете не имеет полного кода.Они помещают фрагменты, и для кого-то, кто никогда не использовал Android Studio, я понятия не имею, куда поместить фрагменты.
Я нашел код онлайн, который делает это вроде.Он использует Thread и обработчик для отправки и получения из сокета udp.Я читал об использовании широковещательной передачи или чего-то подобного для обновления значений в пользовательском интерфейсе.
Вот что у меня есть:
MainActivity.java:
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
public static Handler exHandler;
public static Handler exHandler2;
public static Handler exHandler3;
public static Handler exHandler4;
private ChatServer chatserver;
private ChatSender chatsender;
private TextView texv_ip, texv_recv, texv_send;
private EditText edt_ip, edt_socket;
private ImageView image1, image2, image3, image4;
private TextView text1, ,text2, text3;
private int num1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
texv_ip = (TextView) findViewById(R.id.textView);
texv_recv = (TextView) findViewById(R.id.textView2);
texv_send = (TextView) findViewById(R.id.textView5);
text1 = (TextView) findViewById(R.id.text1);
text2 = (TextView) findViewById(R.id.text2);
text3 = findViewById(R.id.text3);
image1 = findViewById(R.id.image);
num1 = 0;
//receive text
exHandler=new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String msgString = (String)msg.obj;
Log.d("Handler","Now in Handler");
texv_recv.setText(null);
texv_recv.setText("Receive: " + msgString);
}
};
exHandler1=new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String msgString = (String)msg.obj;
Log.d("Handler","Now in Handler");
text1.setText(null);
text1.setText(msgString);
}
};
exHandler2=new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String msgString = (String)msg.obj;
Log.d("Handler","Now in Handler");
text2.setText(null);
text2.setText(msgString);
}
};
exHandler=new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String msgString = (String)msg.obj;
Log.d("Handler","Now in Handler");
text3.setText(null);
text3.setText(msgString);
}
};
//get wifi IP
StringBuilder IFCONFIG=new StringBuilder();
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetaddress = enumIpAddr.nextElement();
if (!inetaddress.isLoopbackAddress() && !inetaddress.isLinkLocalAddress() && inetaddress.isSiteLocalAddress()) {
IFCONFIG.append(inetaddress.getHostAddress().toString()+"\n");
}
}
}
texv_ip.setText("My IP address is: " + IFCONFIG.toString());
Log.d("LOG_Text", IFCONFIG.toString());
} catch (SocketException ex) {
Log.e("LOG_TaG", ex.toString());
}
try{
chatsender = new ChatSender();
chatserver = new ChatServer();
chatserver.start();
Log.d("User","Thread start...");
}catch(Exception e)
{
String str = e.toString();
Log.e("Error by User", str);
}
}
protected void onStart(){
super.onStart();
}
protected void onPause(){
super.onPause();
if(chatserver != null)
{
if(!chatserver.isInterrupted())
{
chatserver.interrupt();
}
}
if(chatsender != null)
{
if(!chatsender.isInterrupted())
{
chatsender.interrupt();
}
}
}
protected void onResume() {
super.onResume();
}
}
chatserver.java:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
class ChatServer extends Thread{
private DatagramSocket server = null;
private static final int PORT = 8008;
public ChatServer() throws IOException {
server = new DatagramSocket(PORT);
Log.d("User","new server socket");
}
public void run(){
byte[] byte1024 = new byte[1024];
DatagramPacket dPacket = new DatagramPacket(byte1024, 100);
String txt = "PRE,SL:35;CS:42;RS:40";
try{
Log.d("User","running run()");
while(true){
server.receive(dPacket);
while(true)
{
txt = new String(byte1024, 0, dPacket.getLength());
String[] preamble = txt.split(",");
String[] label = preamble[1].split(";");
String[] textdata1 = label[0].split(":");
MainActivity.exHandler.sendMessage(MainActivity.exHandler.obtainMessage(1,txt));
MainActivity.exHandler1.sendMessage(MainActivity.exHandler1.obtainMessage(1,textdata1[1]));
String[] textdata2 = label[1].split(":");
MainActivity.exHandler2.sendMessage(MainActivity.exHandler2.obtainMessage(1,textdata2[1]));
String[] textdata3 = label[2].split(":");
MainActivity.exHandler3.sendMessage(MainActivity.exHandler3.obtainMessage(1,textdata3[1]));
Log.d("User","Handler send Message");
if(true) break;
}
//CloseSocket(client);
}
}
catch(IOException e)
{}
}
private void CloseSocket(DatagramSocket socket) throws IOException{
socket.close();
}
}
chatsender.java (я не использую это, но это было с примером, который я нашел)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import android.util.Log;
class ChatSender extends Thread{
public void run(String strIP, String str, int port){
DatagramSocket socket = null;
try
{
socket = new DatagramSocket();
InetAddress serverAddress = InetAddress.getByName(strIP);
Log.d("IP Address", serverAddress.toString());
DatagramPacket packet;
//send socket
packet=new DatagramPacket(str.getBytes(),str.length(),serverAddress,port);
socket.send(packet);
}
catch(SocketException e)
{
e.printStackTrace();
String error = e.toString();
Log.e("Error by Sender", error);
}
catch(UnknownHostException e)
{
e.printStackTrace();
String error = e.toString();
Log.e("Error by Sender", error);
}
catch(IOException e)
{
e.printStackTrace();
String error = e.toString();
Log.e("Error by Sender", error);
}
catch(Exception e)
{
e.printStackTrace();
String error = e.toString();
Log.e("Error by Sender", error);
}
finally{
if(socket != null){
socket.close();
}
}
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_dark"
tools:context="com.myApp.Mainactivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="708dp"
android:text="@string/my_ip_address"
android:textColor="#ffffff"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:text="@string/receive_null"
android:textColor="#ffffff"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<ImageView
android:id="@+id/image4"
android:layout_width="161dp"
android:layout_height="65dp"
android:layout_marginStart="101dp"
android:layout_marginTop="25dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="641dp"
android:src="@drawable/ucr"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.242"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.255"
app:srcCompat="@drawable/image4"/>
<ImageView
android:id="@+id/image3"
android:layout_width="96dp"
android:layout_height="86dp"
android:layout_marginStart="8dp"
android:layout_marginTop="25dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/image4"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/image3"/>
<ImageView
android:id="@+id/image2"
android:layout_width="123dp"
android:layout_height="68dp"
android:layout_marginEnd="132dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.763"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.347"
app:srcCompat="@drawable/image2" />
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="#ffffff"
android:textSize="38sp"
android:visibility="visible" />
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="208dp"
android:layout_marginBottom="472dp"
android:text="0"
android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="#ffffff"
android:textSize="38sp" />
<ImageView
android:id="@+id/image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="256dp"
android:layout_marginTop="341dp"
android:layout_marginBottom="190dp"
android:src="@drawable/image1" />
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="@android:color/background_dark"
android:textSize="78sp" />
</androidx.constraintlayout.widget.ConstraintLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myApp">
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
Возможно, мне за это проголосуют, но это работает.Или я должен сказать, что он делает то, что я хочу.
Проблема в том, что все, что я прочитал, использует метод широковещания для обновления значений в пользовательском интерфейсе.
Кроме того, у меня была возможность протестировать только при отправке одного сообщения за раз, но когда я его использую, данные будут поступать с частотой около 10 Гц, и я не уверен, что это будет удерживатьup.
Я также ожидаю, что люди дадут другие ответы, которые делают это.Если я видел связанный ответ, я объясню, почему я не мог его использовать, и если я его не видел, и он полностью отвечает на мой вопрос, я скажу и приму отрицательные голоса.
Спасибо.