Exception, Bekomme diese aber nicht immer.

  • Antworten:9
Sascha N.
  • Forum-Beiträge: 60

18.10.2013, 14:38:38 via Website

Guten Tag an euch,

Ich habe filgenden Code :

EventItemAdapter.Java :
1package de.themicroborgs.tuningtreffen;
2
3import java.util.ArrayList;
4
5import android.content.Context;
6import android.view.LayoutInflater;
7import android.view.View;
8import android.view.ViewGroup;
9import android.widget.ArrayAdapter;
10import android.widget.ImageView;
11import android.widget.TextView;
12
13 public class EventItemAdapter extends ArrayAdapter<Event> {
14 private final Context context;
15 private final ArrayList<Event> values;
16 private String datum_begin = null;
17 private String datum_end = null;
18 private String datum_final = null;
19 private String[] dummyString;
20 private String ort = null;
21 private String platz = null;
22 private View rowView = null;
23 private int i ;
24 public EventItemAdapter(Context context, ArrayList<Event> arrayList) {
25 super(context, R.layout.list_item, arrayList);
26 this.context = context;
27 this.values = arrayList;
28 i = arrayList.size();
29 System.out.println("Anzahl der Einträge " + String.valueOf(i));
30 }
31
32 @Override
33 public View getView(int position, View convertView, ViewGroup parent) {
34 LayoutInflater inflater = (LayoutInflater) context
35 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
36 if (!values.get(position).getNoentry()) {
37 rowView = inflater.inflate(R.layout.list_item, parent, false);
38 // selects the Views in a Variable
39 TextView subjTextView = (TextView) rowView.findViewById(R.id.subject);
40 TextView evDateTextView = (TextView) rowView.findViewById(R.id.DateView);
41
42 TextView PlatzCaption = (TextView) rowView.findViewById(R.id.PlatzCaption);
43 TextView PlatzTextView = (TextView) rowView.findViewById(R.id.PlatzView);
44 TextView OrtCaption = (TextView) rowView.findViewById(R.id.OrtCaption);
45 TextView OrtTextView = (TextView) rowView.findViewById(R.id.OrtView);
46 ImageView ttypeImageView = (ImageView) rowView.findViewById(R.id.TypeView);
47
48 // change the Viewvalues
49
50 subjTextView.setText(values.get(position).getSubject()); // Subject
51 // Veranstalter
52 // veranstalter = values.get(position).getVeranstalter();
53 // Ort
54 ort = values.get(position).getOrt();
55 if (ort == null) {
56 OrtCaption.setVisibility(View.GONE);
57 OrtTextView.setVisibility(View.GONE);
58 } else {
59 OrtCaption.setVisibility(View.VISIBLE);
60 OrtTextView.setVisibility(View.VISIBLE);
61 OrtTextView.setText(ort);
62 }
63 // Platz
64 platz = values.get(position).getPlatz();
65 if (platz == null) {
66 PlatzCaption.setVisibility(View.GONE);
67 PlatzTextView.setVisibility(View.GONE);
68 } else {
69 PlatzCaption.setVisibility(View.VISIBLE);
70 PlatzTextView.setVisibility(View.VISIBLE);
71 PlatzTextView.setText(platz);
72 }
73 // Datum Format and set the value
74 datum_begin = values.get(position).getEvent_date();
75 datum_end = values.get(position).getEvent_end();
76 datum_final = " ";
77 dummyString = datum_begin.split("-");
78 datum_final = datum_final + dummyString[2] + '.' + dummyString[1] + '.' + dummyString[0];
79 if (datum_end != "") {
80 dummyString = datum_end.split("-");
81 if (Integer.parseInt(dummyString[0]) > 0) {
82 datum_final = datum_final + " bis " + dummyString[2] + '.' + dummyString[1] + '.' + dummyString[0];
83 }
84 }
85 evDateTextView.setText(datum_final);
86 datum_final = "";
87 // chance the TType Image
88 String TypeResFile = "white_";
89 int a = values.get(position).getTtype();
90 String c = TypeResFile+Integer.toString(a);
91 ttypeImageView.setImageResource(this.context.getResources().getIdentifier(c, "drawable", "de.themicroborgs.tuningtreffen"));
92 } else rowView = inflater.inflate(R.layout.noentry, parent, false);
93 // Returns the View :)
94 return rowView;
95 }
96 }

in der EventListActivity habe ich folgenden Code um die Daten aus zu lesen :

1private class refresh extends AsyncTask<String, Void, String> {
2 private Exception exception;
3 String response = "";
4 private ArrayList<Event> Entrys = null;
5
6 @Override
7 protected void onProgressUpdate(Void... list) {
8 System.out.println("Run onProgressUpdate");
9 }
10
11 @Override
12 protected void onPreExecute() {
13 final View pbView = (View) findViewById(R.id.Loader);
14 pbView.setVisibility(View.VISIBLE);
15 pbView.refreshDrawableState();
16 }
17
18 @Override
19 protected void onPostExecute(String str) {
20 // TODO: check this.exception
21 // TODO: do something with the feed
22
23 System.out.println("Run onPostExecute");
24 if (Entrys != null) {
25 evAdapter = new EventItemAdapter(EventListActivity.this, Entrys);
26 final ListView EventView = (ListView) findViewById(R.id.list);
27 EventView.setAdapter(evAdapter);
28 }
29 final View pbView = (View) findViewById(R.id.Loader);
30 pbView.setVisibility(View.GONE);
31 pbView.refreshDrawableState();
32 }
33
34 @Override
35 final protected String doInBackground(String... params) {
36 // TODO Auto-generated method stub
37 System.out.println("Run doInBackground");
38 eventList.parse();
39 Entrys = eventList.getEvents();
40 return response;
41 }
42
43}

So nun das Log :
110-18 14:27:52.178: E/AndroidRuntime(3655): FATAL EXCEPTION: main
210-18 14:27:52.178: E/AndroidRuntime(3655): java.lang.IndexOutOfBoundsException: Invalid index 3, size is 1
310-18 14:27:52.178: E/AndroidRuntime(3655): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
410-18 14:27:52.178: E/AndroidRuntime(3655): at java.util.ArrayList.get(ArrayList.java:308)
510-18 14:27:52.178: E/AndroidRuntime(3655): at de.themicroborgs.tuningtreffen.EventItemAdapter.getView(EventItemAdapter.java:36)
610-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.AbsListView.obtainView(AbsListView.java:2161)
710-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.ListView.makeAndAddView(ListView.java:1840)
810-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.ListView.fillDown(ListView.java:675)
910-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.ListView.fillSpecific(ListView.java:1333)
1010-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.ListView.layoutChildren(ListView.java:1633)
1110-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.AbsListView.onLayout(AbsListView.java:2012)
1210-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.View.layout(View.java:14296)
1310-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewGroup.layout(ViewGroup.java:4562)
1410-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
1510-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
1610-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
1710-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.View.layout(View.java:14296)
1810-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewGroup.layout(ViewGroup.java:4562)
1910-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
2010-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.View.layout(View.java:14296)
2110-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewGroup.layout(ViewGroup.java:4562)
2210-18 14:27:52.178: E/AndroidRuntime(3655): at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349)
2310-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.View.layout(View.java:14296)
2410-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewGroup.layout(ViewGroup.java:4562)
2510-18 14:27:52.178: E/AndroidRuntime(3655): at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
2610-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.View.layout(View.java:14296)
2710-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewGroup.layout(ViewGroup.java:4562)
2810-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976)
2910-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)
3010-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
3110-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
3210-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
3310-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
3410-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.Choreographer.doFrame(Choreographer.java:532)
3510-18 14:27:52.178: E/AndroidRuntime(3655): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
3610-18 14:27:52.178: E/AndroidRuntime(3655): at android.os.Handler.handleCallback(Handler.java:730)
3710-18 14:27:52.178: E/AndroidRuntime(3655): at android.os.Handler.dispatchMessage(Handler.java:92)
3810-18 14:27:52.178: E/AndroidRuntime(3655): at android.os.Looper.loop(Looper.java:137)
3910-18 14:27:52.178: E/AndroidRuntime(3655): at android.app.ActivityThread.main(ActivityThread.java:5289)
4010-18 14:27:52.178: E/AndroidRuntime(3655): at java.lang.reflect.Method.invokeNative(Native Method)
4110-18 14:27:52.178: E/AndroidRuntime(3655): at java.lang.reflect.Method.invoke(Method.java:525)
4210-18 14:27:52.178: E/AndroidRuntime(3655): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
4310-18 14:27:52.178: E/AndroidRuntime(3655): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
4410-18 14:27:52.178: E/AndroidRuntime(3655): at dalvik.system.NativeStart.main(Native Method)

Was mich am Meisten wundert ist das Diese Exception nicht immer auftritt.
Auf meinem Tablet (Galaxy Tab 2) taucht sie nach 2 maliger aktion auf.

Auf Meinem Handy (Galaxy S III) bisher Garnicht

und im Emulator nach knapp 8 maligem ausführen.

hat jemand eine Idee ? oder bracht ihr noch weiteren code um zu wissen woran es liegen kann ?

gruss Sascha

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

18.10.2013, 14:57:06 via App

Steht doch da. Es wird Index 3 aufgerufen, obwohl es diesen nicht gibt (size = 1).

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
Sascha N.
  • Forum-Beiträge: 60

18.10.2013, 15:17:42 via App

das habe ich gesehen. nur wie dieser falsche index zu stande kommt ist mir schleierhaft.

habe in der itemadapter schon einen Zusatz eingesetzt wo Überprüft wird ob die Position des arrays höher ist als die Anzahl. gleicher Fehler. :(

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

18.10.2013, 16:56:06 via Website

Na ja, der Code hat so seine Probleme. Mal angesehen davon das du variablen mal groß mal klein schreibst, was zumindest die Lesbarkeit echt einschränkt, den rest macht das AndroidPit forum schlecht lesbar. Aber die pennen ja weiter ...


Im Konstruktor gibst du eine ArrayList rein, ich sehe nicht das der Adapter die direkt benutzt sondern das du praktisch am Adapter "vorbei" arbeitest.
Wenn du deine ArrayList irgendwo anders veränderst bekommt der Adapter davon mal zu garnichts mit, daher sicher auch die Exception.


Änderungen laufen ALLE über den Adapter. Nach Änderung rufst du nofityChange auf, fertig. Auch würde ich dringend davon abraten direkt

1this.values = arrayList;

weiter zu benutzen, der Adapter kennt die Daten bereits und hat entsprechende Methoden diese auszulesen. Das erspart die eine Variable die du nicht brauchst sowie mögliche Seiteneffekte wenn es darum geht wenn die ArrayList woanders verändert wird die im Konstruktor reingegeben wird.
Hier sollte man defensiv programmieren sonst hast du sowas wie eine Race Condition, je nach Thread der das externe ArrayList verändert...

hth,
Mac

— geändert am 18.10.2013, 16:58:42

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Sascha N.
  • Forum-Beiträge: 60

18.10.2013, 17:23:04 via App

danke für den Hinweis.

ich habe die ganze Zeit schon darüber nachgedacht das offenbar etwas mit dem Verweis auf den array zu tun hat.

da die Aktion des datendownloads im Hintergrund abläuft entsteht offenbar eine Überschneidung der Daten. was wohl dazu führt das der eine array einen size von 1 angibt wobei aber der andere array der verwendet wird eine size von bsp. 4 zurückgibt, was meiner Vermutung nach dann die exception auslöst da ja der eintrag 2 oder höher nicht existiert.

im Klartext muss ich die Prozeduren über arbeiten und diese Zuweisung unterbinden und wie du schon erwähnt hast direkt den Adapter verweden .

eines ist mal tatsache. die Umstellung für mich von einer auf die andere Programmiersprache erfordert auch eine offenbar andere Herangehensweise.

ich werde das heute NACHT mal umsetzen und dann die veränderte Adapter classe mal hier Posten.

sollte ich mich mit einer Annahme irren weise mich darauf hin und ich kann evtl weitere Fehler im Vorfeld vermeiden.

danke auf alle Fälle für den Hinweis :)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

18.10.2013, 19:09:46 via Website

Mit der Sprache hat das mal rein garnichts zu tun. Es geht vielmehr darum zu erkennen das Daten von unterschiedlichen Klassen gesehen werden.
Das mit dem Adapter kann man überall in den Android Docs nachlesen, tue das mal :) Erfahrung führt aber schneller dazu sowas zu erkennen, Bücher über Software Architektur helfen ebenfalls :bashful: Dadrin liest man zum bsp. das eine Klasse nur eine Aufgabe haben sollte.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Sascha N.
  • Forum-Beiträge: 60

19.10.2013, 18:42:37 via App

ich habe im log folgendes gefunden,

offenbar wird während die Daten bearbeitet werden erneut Daten heruntergeladen ich kann mir aber nicht erklären warum.

dadurch wird offenbar der array während die Daten ausgelesen werden neu geschrieben und dadurch entsteht der Fehler das die Anzahl der Daten nicht stimmt.

ist mir ein Rätsel

Antworten
Sascha N.
  • Forum-Beiträge: 60

20.10.2013, 07:27:56 via Website

Fehler Gefunden.

Ich habe an den stellen wo ich ändern musste um den fehler los zu werden "// Hier stand als der Fehler aufgetreten ist" eingesetzt.
Hier die XMLhandler.java
1public class XMLHandler extends DefaultHandler {
2 Boolean currentElement = false;
3 String currentValue = null;
4 int EvAnz = 0;
5 private static Event event;
6 // Hier stand als der Fehler aufgetreten ist
7 // private static ArrayList<Event> eventList = new ArrayList<Event>;
8 private static ArrayList<Event> eventList;

9
10
11 public static ArrayList<Event> getEventList() {
12 return eventList;
13 }
14
15 @Override
16 public void startElement(String uri, String localName, String qName,
17 Attributes attributes) throws SAXException {
18
19 currentElement = true;
20
21 if (localName.equalsIgnoreCase("events"))
22 {
23 /** Start */
24 // Hier stand als der Fehler aufgetreten ist
25 // eventList.clear();
26 eventList = new ArrayList<Event>();

27
28 } else if (localName.equalsIgnoreCase("event"))
29 {
30 event = new Event();
31 eventList.add(event);
32 } else if (localName.equals("user_id")) {
33 /** Get attribute value */
34 String attr = attributes.getValue("id");
35 event.setUser_id(Integer.parseInt(attr));
36 } else if (localName.equals("ttype")) {
37 /** Get attribute value */
38 String attr = attributes.getValue("id");
39 event.setTtype(Integer.parseInt(attr));
40 }
41
42
43 }
44
45 @Override
46 public void endElement(String uri, String localName, String qName)
47 throws SAXException {
48
49 currentElement = false;
50
51 /** set value */
52
53 if (localName.equalsIgnoreCase("imganz"))
54 {
55 event.setImgAnz(Integer.valueOf(currentValue));
56 } else if (localName.equalsIgnoreCase("noentrys"))
57 {
58 event.setNoentry(Boolean.valueOf(currentValue));
59 } else if (localName.equalsIgnoreCase("id"))
60 {
61 event.setId(Integer.parseInt(currentValue));
62 } else if (localName.equalsIgnoreCase("typ"))
63 {
64 event.setTyp(Integer.parseInt(currentValue));
65 } else if (localName.equalsIgnoreCase("message"))
66 {
67 event.setMessage(currentValue);
68 } else if (localName.equalsIgnoreCase("event_end"))
69 {
70 event.setEvent_end(currentValue);
71 } else if (localName.equalsIgnoreCase("veranstalter"))
72 {
73 event.setVeranstalter(currentValue);
74 } else if (localName.equalsIgnoreCase("ort"))
75 {
76 event.setOrt(currentValue);
77 } else if (localName.equalsIgnoreCase("Platz"))
78 {
79 event.setPlatz(currentValue);
80 } else if (localName.equalsIgnoreCase("pokale"))
81 {
82 event.setPokale(currentValue);
83 } else if (localName.equalsIgnoreCase("web_address"))
84 {
85 event.setWeb_adress(currentValue);
86 } else if (localName.equalsIgnoreCase("user_id"))
87 {
88 event.setUser_idName(currentValue);
89 } else if (localName.equalsIgnoreCase("subject"))
90 {
91 event.setSubject(currentValue);
92 } else if (localName.equalsIgnoreCase("event_date"))
93 {
94 event.setEvent_date(currentValue);
95 } else if (localName.equalsIgnoreCase("ttype"))
96 {
97 event.setTtypeName(currentValue);
98 }
99 }
100
101 @Override
102 public void characters(char[] ch, int start, int length)
103 throws SAXException {
104 if (currentElement) {
105 currentValue = new String(ch, start, length);
106 currentElement = false;
107 }
108
109 }
110
111}

Ich verstehe nur nicht WARUM da ein fehler aufgetreten ist. Vor allem das der nicht immer aufgetreten ist und jetzt weg ist.
kann mir das Jemand erklären ?

gruss Sascha

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.10.2013, 14:06:33 via App

Du musst das new Arraylist Element im konstruktor aufrufen.
Ausserdem heisst es new ArrayList<event>();

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Sascha N.
  • Forum-Beiträge: 60

21.10.2013, 18:22:51 via App

so wie es jetzt da stehr funktioniert es.

wenn ich das jetzt in den constructor packe bekomme ich doch sicherlich wieder eine Fehler Meldung oder ? ich werde es versuchen und berichten.

Antworten