Problème UDP dans un fragment
Bonjour à tous,
Je me tourne vers vous car je suis désespéré. Pour un projet de fin d'année je dois établir une connexion entre une carte arduino ( Due) avec un shield ethernet et l'application que j'ai créée, le tout grâce à un router wifi.
Le prof nous a donné 2 solutions, soit par UDP, soit par OSC ( qui passe par l'UDP également).
Donc avant de faire des liens entre le code arduino et android, j'ai voulu allumer une led à distance en utilisant l'UDP et c'est là que le problème arrive. Mon application est séparée en plusieurs fragment auxquels je peux accéder avec un navigationDrawer. Dans le 1er fragment qui est ma fenêtre principale , j'ai mis un toggleButton (j'ai essayé avec un switch également) pour allumer cette fameuse led.
J'ai tout essayé (ou presque puisque ça ne fonctionne pas). A chaque fois j'ai l'erreur android.os.NetworkOnMainThreadException.
Donc je me suis renseigné et j'ai donc essayé avec une AsyncTask et aussi avec un nouveau Thread. Comme je suis débutant je pense que je les ai mal écrit car j'avais des crash et du coup je suis revenu en arrière avec la méthode sans l'AsyncTask et j'ai mis 2 boutons simples.
Voici le fragment
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
import android.app.Fragment;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class HomeFragment extends Fragment {
public HomeFragment() {
}
private Button on;
private Button off;
private String myIP = "192.168.1.105";
private int port = 8032;
InetAddress ip;
DatagramPacket send, rec;
DatagramSocket d1;
String modifiedSentence;
byte[] data;
private boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.isConnected())
return true;
return false;
}
public void led(String s) throws Exception {
data = (s.getBytes());
if (isOnline()) {
ip = InetAddress.getByName(myIP);
d1 = new DatagramSocket();
try {
send = new DatagramPacket(data, data.length, ip, port);
} catch (Exception e) {
}
d1.send(send);
d1.setSoTimeout(1000);
d1.receive(rec);
modifiedSentence = new String(rec.getData());
InetAddress returnIPAddress = rec.getAddress();
Toast.makeText(getActivity().getApplicationContext(), "Reply from Server:" + returnIPAddress, Toast.LENGTH_LONG).show();
d1.close();
} else {
Toast.makeText(getActivity().getApplicationContext(), "No network", Toast.LENGTH_LONG).show();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
SeekBar seekBarProgress;
seekBarProgress = (SeekBar) rootView.findViewById(R.id.seekBar_progress);
final CircleProgressBar circleProgressBar = (CircleProgressBar) rootView.findViewById(R.id.custom_progressBar);
final TextView tv = (TextView) rootView.findViewById(R.id.viewvitesse);
on = (Button) rootView.findViewById(R.id.button_on);
off = (Button) rootView.findViewById(R.id.button_off);
seekBarProgress.setProgress((int) circleProgressBar.getProgress());
seekBarProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
float value = ((float) progress / 5.0f);
if (fromUser)
circleProgressBar.setProgressWithAnimation(progress);
else
circleProgressBar.setProgress(value);
tv.setText(String.valueOf(value) + " cm/s");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
on.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
led("1");
Toast.makeText(getActivity().getApplicationContext(), "ON", Toast.LENGTH_LONG).show();
} catch (Exception e) {
System.out.println("Error::" + e);
}
}
});
off.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
led("2");
Toast.makeText(getActivity().getApplicationContext(), "OFF", Toast.LENGTH_LONG).show();
} catch (Exception e) {
System.out.println("Error::" + e);
}
}
});
return rootView;
}
} |
Voilà, j'espère que vous pourrez m'aider :)
Cordialement.