App stürst nach 4. Eingabe ab mit android.app.ContextImpl$SharedPreferencesImpl.getInt(ContextImpl.java:2817)

  • Antworten:7
  • Bentwortet
Cedrik Laue
  • Forum-Beiträge: 6

13.04.2014, 20:15:02 via Website

Hallo,
ich habe eine App programmiert, welche es ermöglicht Zeiten zu speichern.
Nun habe ich das Problem, dass die Anwendung nach der 4. Speicherung einer Zeit abstürzt.
Ich weiß nicht woran dass liegen kann. In der Logcat wird das hier geschrieben(was eigentlich nicht sein kann):



Hier ist mein Code der Problemklasse:
[code]package cedrik.com.sportlerapp1;


import java.sql.Timestamp;
import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Tabelle extends Activity
{
Button zurück, reset;

Timer timer;
TextView Namen[] =new TextView[8];
TextView Zeit[] =new TextView[8];
TextView Uhrzeit[] =new TextView[8];
String fertig_zeit_String[] = {"1","2","3","4","5","6","7","8"};
String Name_string[] = {"11","22","33","4","55","66","77","88"};
String jetzt_uhrzeit[] ={"111","222","333","444","555","666","777","888"};
int Jetztzeit[]=new int[8];
String Name[]=new String[8];
int laufzeit[]= new int[8];
Uhrzeitklasse dauerzeit = new Uhrzeitklasse();

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tabelle1);
zurück = (Button) findViewById(R.id.button1);
reset = (Button) findViewById(R.id.button2);
Namen[0] = (TextView) findViewById(R.id.textView4);
Namen[1] = (TextView) findViewById(R.id.textView7);
Namen[2] = (TextView) findViewById(R.id.textView10);
Namen[3] = (TextView) findViewById(R.id.textView13);
Namen[4] = (TextView) findViewById(R.id.textView16);
Namen[5] = (TextView) findViewById(R.id.textView19);
Namen[6] = (TextView) findViewById(R.id.textView22);
Namen[7] = (TextView) findViewById(R.id.textView25);
Zeit[0] = (TextView) findViewById(R.id.textView5);
Zeit[1] = (TextView) findViewById(R.id.textView8);
Zeit[2] = (TextView) findViewById(R.id.textView11);
Zeit[3] = (TextView) findViewById(R.id.textView14);
Zeit[4] = (TextView) findViewById(R.id.textView17);
Zeit[5] = (TextView) findViewById(R.id.textView20);
Zeit[6] = (TextView) findViewById(R.id.textView23);
Zeit[7] = (TextView) findViewById(R.id.textView26);
Uhrzeit[0] = (TextView) findViewById(R.id.textView6);
Uhrzeit[1] = (TextView) findViewById(R.id.textView9);
Uhrzeit[2] = (TextView) findViewById(R.id.textView12);
Uhrzeit[3] = (TextView) findViewById(R.id.textView15);
Uhrzeit[4] = (TextView) findViewById(R.id.textView18);
Uhrzeit[5] = (TextView) findViewById(R.id.textView21);
Uhrzeit[6] = (TextView) findViewById(R.id.textView24);
Uhrzeit[7] = (TextView) findViewById(R.id.textView27);

zurück.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent Weiterleitung =new Intent(Tabelle.this,Stoppuhr.class);
startActivity(Weiterleitung);
finish();
}
});
reset.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {


SharedPreferences test = getSharedPreferences("Stoppuhr1", MODE_PRIVATE);

for(int i=0;i<8;i++)
{
test.edit().remove(fertig_zeit_String[i]).commit();
test.edit().remove(Name_string[i]).commit();
test.edit().remove(jetzt_uhrzeit[i]).commit();
}
test.edit().remove("iZahl").commit();


}
});

}


protected void onResume()

{


super.onResume();
timer = new Timer(getString(R.string.app_name));
timer.schedule(new TimerTask() {
@Override
public void run() {

runOnUiThread(new Runnable() {
@Override
public void run()
{
for(int i=0;i<8;i++)
{
SharedPreferences pref = getSharedPreferences("Stoppuhr1", MODE_PRIVATE);
laufzeit[i] = pref.getInt(fertig_zeit_String[i], 0);
Name[i] = pref.getString(Name_string[i], "xy");
Jetztzeit[i] = pref.getInt(jetzt_uhrzeit[i], 0);
}

for(int i=0; i<8;i++)
{
if(laufzeit[i]==0)
{
Zeit[i].setText("");
}
else if(laufzeit[i]!=0)
{
Zeit[i].setText(""+dauerzeit.Zeit_inStringuhrzeit_inms(laufzeit[i]));
}
if(Jetztzeit[i]==0)
{
Uhrzeit[i].setText("");
}
else if(Jetztzeit[i]!=0)
{
Uhrzeit[i].setText(""+dauerzeit.Zeit_in_Stringuhrzeit(Jetztzeit[i]));
}
if(Name[i]=="xy")
{
Namen[i].setText("");
}
else if(Jetztzeit[i]!=0)
{
Namen[i].setText(""+Name[i]);
}
}






}


});
}
}, 0, 2000);

}

}[/code]


und hier der Coder der Hauptklasse:
[code]package cedrik.com.sportlerapp1;

import java.sql.Timestamp;
import java.util.Timer;
import java.util.TimerTask;







import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Stoppuhr extends Activity {

Button Tabelle, Start_Stopp, Save;
EditText Nameneingabe;
TextView Stoppzeit, Uhrzeit;
boolean Start_Stopp_Status=false;
int zähler =1;
int fertige_zeit=0;
String fertig_zeit_String[] = {"1","2","3","4","5","6","7","8"};
String Name_string[] = {"11","22","33","4","55","66","77","88"};
String jetzt_uhrzeit[] ={"111","222","333","444","555","666","777","888"};
int i=0;
Timer timer;
Uhrzeitklasse diezeit = new Uhrzeitklasse();
long zeit1=0,zeit2=0;
int zeitminuszeit;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.stoppuhr);
Tabelle = (Button) findViewById(R.id.button1);
Start_Stopp = (Button) findViewById(R.id.button2);
Save = (Button) findViewById(R.id.button3);
Stoppzeit = (TextView) findViewById(R.id.textView2);
Uhrzeit = (TextView) findViewById(R.id.textView1);
Nameneingabe = (EditText) findViewById(R.id.editText1);
Stoppzeit.setText("00:00:00,0000");



Start_Stopp.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

Start_Stopp_Status = true;

if(zähler%2==1)
{
Start_Stopp.setText("Stopp");
}
else if(zähler%2==0)
{
Start_Stopp.setText("Start");
}
zähler++;
}
});

Save.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

SharedPreferences test = getSharedPreferences("Stoppuhr1", MODE_PRIVATE);
i = test.getInt("iZahl", 0);
Editor editor = test.edit();
editor.putInt(fertig_zeit_String[i],fertige_zeit).commit();
editor.putString(Name_string[i],Nameneingabe.getText().toString()).commit();
editor.putInt(jetzt_uhrzeit[i], diezeit.Sekundenanzahl_des_tages()).commit();
i++;
editor.putInt("iZahl", i).commit();
editor.commit();
}
});


Tabelle.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v)
{
Intent Weiterleitung = new Intent(Stoppuhr.this, Tabelle.class);
startActivity(Weiterleitung);
finish();
}
});



}






protected void onResume()

{

super.onResume();
timer = new Timer(getString(R.string.app_name));
timer.schedule(new TimerTask() {
@Override
public void run() {

runOnUiThread(new Runnable() {
@Override
public void run()
{


Timestamp time1 = new Timestamp(System.currentTimeMillis());
zeit1 = time1.getTime();
Uhrzeit.setText(""+diezeit.Zeit_in_Stringuhrzeit(diezeit.Sekundenanzahl_des_tages()));

if(zeit2!=0&& Start_Stopp_Status==false)
{
zeitminuszeit = (int)(zeit1-zeit2);
Stoppzeit.setText(diezeit.Zeit_inStringuhrzeit_inms(zeitminuszeit));
}
if(zeit2==0 && Start_Stopp_Status==true)
{
Timestamp time2 = new Timestamp(System.currentTimeMillis());
zeit2 = time2.getTime();
Start_Stopp_Status=false;
}

if(zeit2!=0 && Start_Stopp_Status==true)
{
fertige_zeit=(int)(zeit1-zeit2);
Stoppzeit.setText(diezeit.Zeit_inStringuhrzeit_inms(fertige_zeit));
zeit2=0;
Start_Stopp_Status=false;
}







}


});
}
}, 0, 50);

}

}
[/code]

Wenn man in der Logcat auf die verschiedenen Zeilen klickt kommt man auf:
laufzeit[i] = pref.getInt(fertig_zeit_String[i], 0);(wenn man diese Zeile auskommentiert, dann funktioniert alles, bis auf dass die lauf zeit angezeigt wird.)



Danke schon mal im Voraus

Cedrik Laue

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

13.04.2014, 20:41:33 via Website

Bitte poste mal das Vollständige LogCat

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

Antworten
Cedrik Laue
  • Forum-Beiträge: 6

13.04.2014, 22:30:33 via Website


Zeile 118: laufzeit[i] = pref.getInt(fertig_zeit_String[i], 0);

Antworten
Georg C.
  • Forum-Beiträge: 235

14.04.2014, 08:58:10 via Website

Hi,
also obwohl mein Deutsch fatal ist, versuche es auf Deutsch zu übersetzten:

... In der Logcat wird das hier geschrieben(was eigentlich nicht sein kann): ...

In der Logcat steht eigentlich alles erklärt!
...
java.lang.ClassCastException: java.lang.String at android.app.ContextImpl$SharedPreferencesImpl.getInt(ContextImpl.java:2817)
...
Zum Code:
1) Du deklarierst und initialisierst einen int Array mit 9 Feldern. (von Datentyp int!)
1... int laufzeit[]= new int[8]; ...

2) Mit der pref Instanz der SharedPreferences Klasse, möchtest Du die Stoppuhr1 Daten auf
dem Display visualisieren.
1... SharedPreferences pref = getSharedPreferences("Stoppuhr1", MODE_PRIVATE); ...

3) Die public abstract SharedPreferences getSharedPreferences (String name, int mode) Methode erwartet 2 Parametern 1- String name, - 2 int mode.
Wenn ich es richtig sehe, (?interpretiere) Du übergibst der getSharedPreferences(...) Methode nicht wirklich einen String Objekt, sondern einen String Array. (was aber eigentlich Korrekt ist) ...???
1... String fertig_zeit_String[] = {"1","2","3","4","5","6","7","8"}; ...
Und genau das wird nicht akzeptiert. (gehe davon aus, weil langsam habe auch bedenken .... ) :wacko:
Probiere es bitte (als Test) mit:

[code]String test = "12345Test";
laufzeit[i] = pref.getInt(test, 0);[/code]


LG
Georg

Ps.
Wenn meine Behauptungen nicht stimmen, dann SORRY! ...... wechsle ich zum Apple iphone - :grin:

EDIT:
Gerade gesehen - Du initialisierst die Array mit 8, es sind aber 9!!!! Felder
Das xxx[0] - wird oft vergessen.

— geändert am 14.04.2014, 09:15:20

Sorry für Gramatik & Stilistik Fehler.

Antworten
Georg C.
  • Forum-Beiträge: 235

14.04.2014, 10:27:12 via Website

Hi,
ich noch mall, (SORRY für den doppeln Post) habe gerade etwas "tiefer" recherchiert ...
Sag mall:
funzt Dein Test?

[code]@Override
public void onClick(View v) {

SharedPreferences test = getSharedPreferences("Stoppuhr1", MODE_PRIVATE);
i = test.getInt("iZahl", 0);
Editor editor = test.edit();
editor.putInt(fertig_zeit_String[i],fertige_zeit).commit();
editor.putString(Name_string[i],Nameneingabe.getText().toString()).commit();
editor.putInt(jetzt_uhrzeit[i], diezeit.Sekundenanzahl_des_tages()).commit();
i++;
editor.putInt("iZahl", i).commit();
editor.commit();
}
});[/code]

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Cedrik Laue
  • Forum-Beiträge: 6

14.04.2014, 11:45:39 via Website

Hi,
der Test funktioniert.
Das mit den 8 Feldern ist schon so gedacht.
LG
Cedrik

Antworten
Cedrik Laue
  • Forum-Beiträge: 6

14.04.2014, 11:52:22 via Website

Hi,
interessanterweise hat sich das Problem gelöst, als ich die Füllung der Arrays änderte.
also:
1String fertig_zeit_String[] = {"1","2","a","b","c","d","e","f"};
muss wohl irgendein Bug sein.

LG und danke
Cedrik

Antworten