- Forum-Beiträge: 21
22.01.2013, 19:42:03 via Website
22.01.2013 19:42:03 via Website
ich schreibe zur Zeit eine App die sich per Bluetooth mit einem Gerät verbindet, welches mir Daten schickt.
Diese Daten nehme ich auf und schreibe sie in eine Excel Datei.
Für Excel benutze ich die Apache POI Library und komme gut damit zurecht.
Mein Problem:
Wenn ich die App auf dem Samsung Galaxy S2 laufen lasse, werden mir bei jedem Empfangen der Daten ein Ladefenster angezeigt bis der Schreibevorgang abgeschlossen ist. Dort funktioniert es also ohne Probleme. Wenn ich das ganze auf ein Galaxy Tab 2 7 Zoll, Android 4.0.4 mache, werden beim ersten Daten-Empfangen die Daten ohne Probleme in die Excel Datei geschrieben. Wenn nun aber der zweite Datensatz kommt, hängt sich die App nach 15 Sekunden auf und sagt " 'Name-der-App wurde' angehalten" und wird geschlossen...
Hier mal die wesentlichen CodeSchnipsel:
Main Activity
2 switch (view.getId()) {
3 case R.id.sf_connect:
4 if(Mac_Adresse != null){
5 int v = tool.connect(Mac_Adresse);
6 switch (v){
7 case 1:
8 Toast.makeText(this, "Mit Instrument verbunden!", Toast.LENGTH_SHORT).show();
9 new Listening(handler,tool,tool.Socket, dialog).execute(); // hier starte ich den AsyncTask !!!
10 break;
11 case 2:
12 Toast.makeText(this, "Instrument ist bereits verbunden!", Toast.LENGTH_SHORT).show();
13 break;
14 case 0:
15 Toast.makeText(this, "Verbindung fehlgeschlagen!", Toast.LENGTH_SHORT).show();
16 break;
17 }
18 }else{
19 Toast.makeText(this, "Kein Instrument ausgewählt", Toast.LENGTH_SHORT).show();
20 }
21 break;
22 }
23 }
Wenn die Verbindung also steht, wird der AsyncTask für das "port-listening" gestartet.
Hier die Klasse Listening:
2 protected String doInBackground(String... arg0) {
3 msg = "-1";
4 tmpinput = null;
5
6 try {
7 tmpinput = socket.getInputStream();
8 } catch (Exception e) {
9 }
10
11 input = tmpinput;
12 reader = new InputStreamReader(input);
13 br = new BufferedReader(reader);
14
15 handler.post(new Runnable() {
16 public void run() {
17 Main.tx_listen.setText("warte auf Messdaten...");
18 }
19 });
20
21 while (true) {
22
23 try {
24 msg = br.readLine(); //Buffer auslesen
25
26 split = msg.split(","); // Datenstring aufsplitten
27 name = split[0];
28
29 publishProgress("Punkt "+name+" wird in Excel Datei geschrieben..."); //ProgressDialog starten
30
31 rechts = Double.parseDouble(split[1]);
32 hoch = Double.parseDouble(split[2]);
33 hoehe = Double.parseDouble(split[3]);
34
35 excel.fillExcel(name, rechts, hoch, hoehe); // HIER nun das beschreiben der Excel Datei
36 dialog.dismiss();
37
38 } catch (IOException e) {
39 handler.post(new Runnable() {
40 public void run() {
41 Main.tx_listen.setText("warte auf Verbindung...");
42 }
43 });
44 break;
45 }
46 }// while
47 return null;
48 }
49 @Override
50 protected void onProgressUpdate(String... values) {
51
52 dialog.setTitle("schreibe Daten in Excel...");
53 dialog.setMessage(values[0]);
54 dialog.setCancelable(false);
55 dialog.show();
56
57 super.onProgressUpdate(values);
58 }
Soweit sogut, hier nun die Klasse Excel: (ACHTUNG Klasse Excel ist kein Thread und kein AsyncTask)
2 try {
3 InputStream in = new FileInputStream("/sdcard/Download/myXLS.xls"); // Datei auswählen
4 HSSFWorkbook wb = new HSSFWorkbook(in); // Workbook erstellen
5 in.close();
6 HSSFSheet sheet = wb.getSheetAt(0); // Tabelle 1 auswaehlen
7
8 for(int j=1;j<100;j++){ // durch die Zeilen iterieren bis freie Zeile da ist
9 row = sheet.getRow(j);
10 cellname = row.getCell(0);
11 cellrechts = row.getCell(1);
12 cellhoch = row.getCell(2);
13 cellhoehe = row.getCell(3);
14 if(cellrechts.getCellType() == 3){ // wenn die Zelle leer ist, dann iterieren stoppen
15 break;
16 }
17 }
18 cellname.setCellValue(name);
19 cellrechts.setCellValue(rechts);
20 cellhoch.setCellValue(hoch);
21 cellhoehe.setCellValue(hoehe);
22 FileOutputStream out = new FileOutputStream("/sdcard/Download/myXLS.xls"); // OutputFile definieren
23 wb.write(out); // Daten ins Workbook schreiben
24 out.close();
25 } catch (Exception e) {
26
27 }
28 }
Also meine Idee zu dem Problem ist mir gerade während des schreibens eingefallen.
Kann es sein, dass die Klasse Excel selbst ein Thread sein sollte, damit es da zu keinen Problemen kommt?
Ich wäre euch so Dankbar, wenn irgendwelche Tipps oder Ideen kommt würden.
Vielen vielen Dank schonmal im voraus
hoffe dass sich jemand mal den Code anguckt =)
Lieben Gruß
— geändert am 22.01.2013, 19:45:45
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.