Datasocket unterscheid zwischen 4.0 und 2.3?

  • Antworten:13
Michael Mariciniak
  • Forum-Beiträge: 8

28.08.2012, 14:38:42 via Website

Hallo zusammen
ich habe eine App geschrieben mit der ich einige befehle schicke...

Das problem ist dass sie unter android 2.3 läuft aber unter 4.0 bekommt der keine verbindung
beide sind im selben wlan netz und sind auch im selben netzbereich 129.0.99.49 und .21

mein code sieht wie folgt aus
1package mitch.test.ledrgb;
2
3import java.net.DatagramPacket;
4import java.net.DatagramSocket;
5import java.net.InetAddress;
6
7
8import android.os.Bundle;
9import android.app.Activity;
10import android.app.AlertDialog;
11import android.view.Menu;
12import android.view.MenuItem;
13import android.widget.SeekBar;
14import android.widget.SeekBar.OnSeekBarChangeListener;
15import android.support.v4.app.NavUtils;
16
17public class RGBActivity extends Activity implements OnSeekBarChangeListener {
18 String ip = "129.0.99.177";
19 String Text;
20 int Port = 12301;
21 SeekBar seek_red;
22 SeekBar seek_yellow;
23 SeekBar seek_blue;
24 byte[] buf = null;
25 int leng;
26
27 @Override
28 public void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.activity_main);
31
32 seek_red = (SeekBar)findViewById(R.id.red);
33 seek_yellow = (SeekBar)findViewById(R.id.yellow);
34 seek_blue = (SeekBar)findViewById(R.id.blue);
35
36 seek_red.setOnSeekBarChangeListener(this);
37 seek_yellow.setOnSeekBarChangeListener(this);
38 seek_blue.setOnSeekBarChangeListener(this);
39
40 }
41
42 @Override
43 public boolean onCreateOptionsMenu(Menu menu) {
44 getMenuInflater().inflate(R.menu.activity_main, menu);
45 return true;
46 }
47
48 public void onProgressChanged(SeekBar bar, int progress, boolean fromTouch) {
49
50 switch (bar.getId()) {
51
52 case R.id.red:
53
54 Text = ("R"+progress+" ");
55 buf = (Text).getBytes();
56 leng = buf.length;
57 break;
58
59 case R.id.yellow:
60
61 Text = ("Y"+progress+" ");
62 buf = (Text).getBytes();
63 leng = buf.length;
64 break;
65
66 case R.id.blue:
67
68 Text = ("B"+progress+" ");
69 buf = (Text).getBytes();
70 leng = buf.length;
71 break;
72
73 }
74 try {
75 InetAddress serverAddr = InetAddress.getByName(ip); //die IP vom editttext wird in einer Internetadresse umgewandelt
76 DatagramSocket socket = new DatagramSocket();
77
78
79 DatagramPacket packet = new DatagramPacket(buf, leng, serverAddr, Port);
80 socket.send(packet);
81
82
83 }
84
85 catch (Exception e)
86 {
87 AlertDialog.Builder alert = new AlertDialog.Builder(this);//alert ausgeben show nicht vergessen;)
88 alert.setTitle("Fehler");// überschrift des buttons
89 alert.setMessage("Verbindungsfehler");//Text des Buttons
90 alert.setPositiveButton("OK", null);//Position des OK Buttons
91 alert.show();//zeigt alert an
92 }
93 }
94 public void onStartTrackingTouch(SeekBar seek_red) {
95
96 }
97 public void onStopTrackingTouch(SeekBar seek_red) {
98
99 }
100
101}



unten springt der in den catch befehl bei 4.0 .. bei 2.3 funkioniert alles super...


hab auch schon versucht die app neu auf 4.0 basis zu schreiben aber geht auch nicht

Antworten
Michael Mariciniak
  • Forum-Beiträge: 8

28.08.2012, 15:34:05 via Website

alert.setMessage("Verbindungsfehler");

das bekomm ich angezeigt in der APP selber... nicht in eclipse

mit einem Android 4.0 emulator kommt der selbe fehler,

logcat sagt wenn ich mir exception ausgeben lassen "null"

das heißt nun was?

— geändert am 28.08.2012, 15:57:31

Antworten
Michael Mariciniak
  • Forum-Beiträge: 8

29.08.2012, 07:41:53 via Website

ja eben nicht:) das ist nicht mein eigener Text...

Log.e("C2DM", "Exception: " + e.getMessage());

und der Befehl gibt im logcat "Null" aus und ist rot

— geändert am 29.08.2012, 07:42:19

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

29.08.2012, 08:45:20 via Website

Michael Mariciniak
das ist nicht mein eigener Text

Das bezog sich auf den Text "Verbindungsfehler" - das ist Dein eigener Text.

catch mal die beiden Exceptions "SocketException" und versuchsweise "SecurityException" - schmeiss dafür das generische "Exception" raus. Schau mal ob deren getMessage etwas Genaueres enthält. Wenn nicht dann muss ich passen.

Antworten
Michael Mariciniak
  • Forum-Beiträge: 8

14.09.2012, 13:00:54 via Website

SO hallo:) bin mal wieder da;)
also ich habe ein Lösung gefunden, das Problem habe nicht nur ich...

das ganze muss mit einer Thread function gemacht werden
aber wie mache ich das? habe noch nicht so viel mit threading gearbeitet.. bzw. noch garnicht

wie was muss ich in meine code oben ändern um in in ein Thread zu schreiben?

Antworten
Florian B.
  • Forum-Beiträge: 284

14.09.2012, 13:22:41 via Website

Der Klassiker, seit Android 3 oder 4 dürfen Netzwerkzugriffe nicht mehr auf dem UI-Thread ausgeführt werden. Das ist der Grund warum dich Harald, nach der genauen Exception bzw. deren Message gefragt hat.

Du hast verschiedene Möglichkeiten etwas in einem anderen Thread auszuführen. Da wären AsyncTasks, IntentService oder allgemein Services oder normale Threads. Was du am besten nutzt, hängt ein bisschen davon ab, wie der Netzwerk Zugriff ausschaut. Bleibt die Verbindung offen, musst du öfters Daten nachladen. Soll das auch passieren wenn die App nicht sichtbar ist.?

Antworten
Michael Mariciniak
  • Forum-Beiträge: 8

17.09.2012, 18:54:09 via Website

Ich bin nicht so der Experte auf dem gebiet Android Programmierung:(

In meiner App habe ich so Seekbars.. und diese Senden beim schieben halt, den wert der Seekbar an eine bestimme IP..
sonst schickt die eigentlich garnichts..

Würde das denke ich mal am liebsten mit threads machen... nur WIE .. ist die frage:) habe schon einige versucht aber nichts davon hat was gebracht..

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

17.09.2012, 19:21:41 via Website

Zwei Alternativen:

* StrictMode abschalten - dann brauchst Du keinen Thread: Siehe Code Snippets zwei Bretter weiter. Diese Lösung ist Evil, Böse, Dirty.

* AsyncTask/Thread: Auch hierzu gibt es in den Code Snippets zwei Beispiele. Du packst einfach den Netzwerkkram in doInBackground, erweiterst den Konstruktor und die privaten Felder des AsyncTask um die Daten die Du für den Netzwerkverkehr benötigst und wartest in der Activity auf den Listener. Das ist alles.

— geändert am 17.09.2012, 19:23:11

ZaRa

Antworten
Michael Mariciniak
  • Forum-Beiträge: 8

18.09.2012, 15:42:41 via Website

Strictmode habe ich eben ausprobiert, funktioniert leider nicht... die app sagt beim betätigen der Seekbar "unfortunatly ... has stopped"

und das beispiel mit dem Asyctask bzw. thread finde ich leider nicht...
:(

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

18.09.2012, 17:17:48 via Website

Michael Mariciniak
app sagt beim betätigen der Seekbar "unfortunatly ... has stopped"

... und Du hast im LogCat zweifelsfrei feststellen können das das Abschalten des StrictMode die Ursache für den Crash ist?

Glaub ich nicht.


Nachtrag: Lass mich raten. Du hast Dir die zusätzliche Klasse MyApplication erspart und/oder MyApplication nicht im Manifest eingetragen. Das Problem wäre in dem Fall das Android Dich austrickst denn es wird den StrictMode sofort wieder anschalten nachdem Du ihn abgeschaltet hast. Glaub mir, die Abschaltung für die komplette App geht nur so.

— geändert am 18.09.2012, 17:43:11

Antworten
Michael Mariciniak
  • Forum-Beiträge: 8

30.09.2012, 18:51:17 via Website

EDIT:
ich habs nun mit Asynctask gemacht...
1package mitch.test.ledrgb;
2
3
4import java.net.DatagramPacket;
5import java.net.DatagramSocket;
6import java.net.InetAddress;
7
8import android.os.AsyncTask;
9import android.os.Build;
10import android.os.Bundle;
11import android.os.Handler;
12import android.os.StrictMode;
13import android.app.Activity;
14import android.app.AlertDialog;
15import android.content.Context;
16import android.util.Log;
17import android.view.Menu;
18import android.view.MenuItem;
19import android.widget.SeekBar;
20import android.widget.TextView;
21import android.widget.SeekBar.OnSeekBarChangeListener;
22import android.support.v4.app.NavUtils;
23
24public class RGBActivity extends Activity implements OnSeekBarChangeListener {
25 static String ip = "192.168.0.99";
26 String Text;
27 static int Port = 12301;
28 SeekBar seek_red;
29 SeekBar seek_yellow;
30 SeekBar seek_blue;
31 static byte[] buf = null;
32 static int leng;
33 String color;
34 TextView Text1, Text3, Text2;
35
36 @Override
37 public void onCreate(Bundle savedInstanceState) {
38 super.onCreate(savedInstanceState);
39 setContentView(R.layout.activity_main);
40
41 seek_red = (SeekBar)findViewById(R.id.red);
42 seek_yellow = (SeekBar)findViewById(R.id.yellow);
43 seek_blue = (SeekBar)findViewById(R.id.blue);
44
45 seek_red.setOnSeekBarChangeListener(this);
46 seek_yellow.setOnSeekBarChangeListener(this);
47 seek_blue.setOnSeekBarChangeListener(this);
48 }
49
50
51
52public void onProgressChanged(final SeekBar bar, final int progress, boolean fromTouch) {
53
54 switch (bar.getId()) {
55
56 case R.id.red:
57 Text1.setText("r"+progress);
58 Text = ("R"+progress+" ");
59 buf = (Text).getBytes();
60 leng = buf.length;
61 break;
62
63 case R.id.yellow:
64 Text2.setText("y"+progress);
65 Text = ("Y"+progress+" ");
66 buf = (Text).getBytes();
67 leng = buf.length;
68 break;
69
70 case R.id.blue:
71 Text3.setText("b"+progress);
72 Text = ("B"+progress+" ");
73 buf = (Text).getBytes();
74 leng = buf.length;
75 break;
76
77 }
78 new Network().execute(ip);
79}
80
81 public boolean onCreateOptionsMenu(Menu menu) {
82 getMenuInflater().inflate(R.menu.activity_main, menu);
83 return true;
84 }
85
86
87 public void onStartTrackingTouch(SeekBar seek_red) {
88
89 }
90 public void onStopTrackingTouch(SeekBar seek_red) {
91
92 }
93
94
95
96public class Network extends AsyncTask<String, Integer, String>{
97
98 @Override
99 protected String doInBackground(String... params) {
100 // TODO Auto-generated method stub
101 try{
102
103 InetAddress serverAddr = InetAddress.getByName(RGBActivity.ip); //die IP vom editttext wird in einer Internetadree umgewandelt
104 DatagramSocket socket = new DatagramSocket();
105
106 DatagramPacket packet = new DatagramPacket(RGBActivity.buf, RGBActivity.leng, serverAddr, RGBActivity.Port);
107
108 socket.send(packet);
109
110
111 }
112
113 catch (Exception e)
114 {
115 AlertDialog.Builder alert = new AlertDialog.Builder(null);//alert ausgeben show nicht vergessen;)
116 alert.setTitle("Fehler");// überschrift des buttons
117 alert.setMessage("Verbindungsfehler");//Text des Buttons
118 alert.setPositiveButton("OK", null);//Position des OK Buttons
119 alert.show();//zeigt alert an
120 }
121 return null;
122 }
123}
124}

aber!!!.... es schmiert mir immernoch ab....

— geändert am 30.09.2012, 20:57:38

Antworten