String[] problem. Laufzeit?

  • 15 Antworten
  • Neuester Beitrag
Diskutiere String[] problem. Laufzeit? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
S

sugg1

Neues Mitglied
Aus der MainActivity bekomme ich aus einem AsyncTask den String[] uebergabe übergeben. Wenn ich diesen nun in meinen ArrayAdapter einfüge stürzt die App ab. Wenn ich stattdessen den String data benutze funktioniert es.
In der onItemClick Methode bekomme ich die richtigen Daten wenn ich auf die ListFragments drücke.

Woran liegt das? Es sind doch beides String arrays?



Code:
public class MyListFragment extends ListFragment implements AdapterView.OnItemClickListener {
    
    public static String[] uebergabe;
    String[] data={"erster string", "zweiter string","1","2","3","4","5","6"};
    
    
    
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.my_list_fragment, container, false);
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        //ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(), R.array.heroes, android.R.layout.simple_list_item_1); //Lösung mit String-array in strings.xml
        ArrayAdapter adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,  [COLOR=DeepSkyBlue][B]data[/B][/COLOR]);
        setListAdapter(adapter);
        getListView().setOnItemClickListener(this);
    }
    


    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
    {
        Toast.makeText(getActivity(), "Item " +[B][COLOR=DarkOrange]uebergabe[i][/COLOR][/B], Toast.LENGTH_SHORT).show();
    }

}
 
S

sugg1

Neues Mitglied
Hier die Logcat Fehler, wenn ich uebergabe anstatt data benutze:

[FONT=&quot]04-19 16:56:00.690: W/dalvikvm(598): threadid=1: thread exiting with uncaught exception (group=0x409961f8)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): FATAL EXCEPTION: main[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.http/com.example.http.MainActivity}: java.lang.NullPointerException[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.ActivityThread.access$600(ActivityThread.java:122)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.os.Handler.dispatchMessage(Handler.java:99)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.os.Looper.loop(Looper.java:137)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.ActivityThread.main(ActivityThread.java:4340)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at java.lang.reflect.Method.invokeNative(Native Method)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at java.lang.reflect.Method.invoke(Method.java:511)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at dalvik.system.NativeStart.main(Native Method)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): Caused by: java.lang.NullPointerException[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at java.util.Arrays$ArrayList.<init>(Arrays.java:38)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at java.util.Arrays.asList(Arrays.java:154)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at com.example.http.MyListFragment.onActivityCreated(MyListFragment.java:32)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:814)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:981)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1695)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.Activity.performCreate(Activity.java:4468)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)[/FONT]
[FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598): ... 11 more[/FONT]
 
markus.tullius

markus.tullius

Experte
https://www.android-hilfe.de/forum/...ng.9/nullpointerexception-was-tun.522368.html


Code:
[COLOR=Red][FONT=&quot]04-19 16:56:00.710:  E/AndroidRuntime(598): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.example.http/com.example.http.MainActivity}:  java.lang.NullPointerException[/FONT][/COLOR]
Code:
[COLOR=Red][FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598):     at java.util.Arrays$ArrayList.<init>(Arrays.java:38)[/FONT][/COLOR]
Code:
[COLOR=Red][FONT=&quot]04-19 16:56:00.710: E/AndroidRuntime(598):     at com.example.http.MyListFragment.onActivityCreated(  MyListFragment.java:32)[/FONT][/COLOR]
 
S

sugg1

Neues Mitglied
Der Nullpointer bezieht sich auf den String[] uebergabe...

Aber warum?

Wenn ich data benutze und dann auf ein ListFragment drücke bekomme ich den Inhalt des jeweiligen uebergabe String Feldes als Toast angezeigt...

In dem Fall ist es nicht null...
 
Zuletzt bearbeitet:
markus.tullius

markus.tullius

Experte
Poste mal deine Resource, wo du dein Array erstellst.
 
S

sugg1

Neues Mitglied
In der MainActivity in einer AsyncTask Klasse:

Diese hat als Rückgabewert einen String[] an die Klasse onPostExecute(String[] result)

result ist das Stringarray, das in der Klasse MyListFragment benötigt wird.

Dieses versuche ich folgendermaßen an eine static Variable der Klasse MyListFragment zu übergeben:

MyListFragment.uebergabe = result;
 
markus.tullius

markus.tullius

Experte
Nicht das. ;) Ich meine das xml - file, wo das array R.array.heroes definiert ist.
 
S

sugg1

Neues Mitglied
Damit funktioniert es ja. Die Zeile mit dem ArrayAdapter R.array.heroes ist auskommentiert ;D

Code:
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">HTTP</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    
    <string-array name="heroes">
        <item >Mage</item>
        <item >Hunter</item>
    </string-array>
    

</resources>
Ich denke der Fehler liegt an der Übergabe von der MainActivity zur MyListFragment Klasse...

Bei onActvityCreate ist das Array noch nicht gefüllt.
Bei onItemClick schon... :unsure:
 
markus.tullius

markus.tullius

Experte
Du brauchst ein Handler, und keine statische Methode.


Bei AsyncTask steckt der Handler in der Methode protected void onPostExecute(Long result).

Dort muss du das Array übergeben.
 
S

sugg1

Neues Mitglied
Wie muss ich vorgehen?

Handler handler = new Handler(); ??

habe beim googeln viel über Handler gefunden, aber nicht das, was ich brauche...

Ein Beispiel wäre super :)

Ansonsten werde ich es heute abend nochmal versuchen.
 
ui_3k1

ui_3k1

Gesperrt
Ich habe die Vermutung dass das Problem derzeit doch eher beim array liegt. Der Nullpointer könnte durch einen Zugriff an einer unbekannten Stelle entstehen. Vielleicht durch Zuweisung oder Initialisierung bedingt. So ganz schlau bin ich auch noch nicht aus deinem Code geworden :-D (liegt aber wahrscheinlich nicht an deinem Code, sondern an meinem 5 Zoll Display und der morgendlichen Müdigkeit) :-D ich schaue später auch noch mal drüber.
 
A

amfa

Experte
Ich vermute das Problem könnte auch daran liegen, dass du halt versuchst auf das array zuzugreifen, bevor es durch den asyntask gesetzt wurde.
Das "Problem" mit AsynTask und Threads ist ja, dass sie eben asynchron laufen.
Das heißt du weißt in anderen Codestellen nicht ohne weiteres, ob der Task schon fertig ist.

Wenn du den AsyncTask nun startest und der brauchen 5 sekunden.
Du aber innerhalb von 3 Sekunden auf dein Listfragment wechselst ist ubergabe dort noch leer.
Theoretisch sollte es funktionieren, wenn du wartest bis dein AsyncTask fertig ist.
 
ui_3k1

ui_3k1

Gesperrt
@amfa: klingt sinnvoll. Wenn es daran liegt, könnte man dem Array einfach Standardwerte übergeben und solange die nicht verändert wurden, die Ausgabe blockieren, ignorieren, etc...
 
S

sugg1

Neues Mitglied
Erstmal danke, dass ihr euch so bemüht :)

Ich habe versucht in der Methode onActivityCreate zu warten, das hat aber nicht funktioniert.

Das mit dem warten wäre allgemein eine "unschöne" Lösung, oder?:unsure:
 
ui_3k1

ui_3k1

Gesperrt
Hmm, das kommt drauf an wie man es implementiert. Mit "warten" meine ich nicht, dass das System per sleep wartet... Sondern:
Wenn im Hintergrund Berechnungen laufen und deren Ergebnisse noch nicht verfügbar sind, lässt sich entweder was an der "Berechnung" verändern dass die just in time fertig ist, oder wenn das nicht möglich ist, muss man dafür Sorge tragen, dass es keine unerlaubten Zugriffe auf die Datenfelder gibt.
Eine andere Möglichkeit fällt mir da spontan nicht ein. Ggf auf das Array zu verzichten und es irgendwie anders zu speichern / übergeben.
Vielleicht ist der vector-Container eher geeignet? Ich komme aus der C++ Ecke und da verzichte ich praktisch komplett auf Arrays, da diese weitaus weniger STL-Methoden bereitstellen. Ob das in Java auch gangbare Praxis ist, weiß ich leider nicht - würde mich aber auch mal interessieren. :)

Edit:
Code:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
    </string-array>
</resources>
[I]
[...]
[/I]
Resources res = [URL="http://developer.android.com/reference/android/content/Context.html#getResources%28%29"]getResources()[/URL];
String[] planets = res.[URL="http://developer.android.com/reference/android/content/res/Resources.html#getStringArray%28int%29"]getStringArray[/URL](R.array.planets_array);
Bist du dir sicher, dass du den String, der im Array eingetragen ist richtig empfängst? Du darfst auch gerne nochmal deinen aktuellen Code posten. :)

String Resources | Android Developers
 
Zuletzt bearbeitet:
A

amfa

Experte
auch in Java nutze ich lieber das Collection Framwork als Arrayersatz bietet sich da natürlich die ArrayList an.

Das macht aber keinen Unterschied.
Dann wäre die Liste an der Stelle nicht gefüllt.

Wenn man auf einen AsyncTask warten muss, dann macht man das normalerweise so, dass man eine Progressbar anzeigt (dieser sich drehende Kreis oder auch von Windows als "Sanduhr" bekannt.)
Entweder nur an der Stelle für die man Daten läd, oder aber wenn die gesamte Activity davon abhängt legt man am besten so einen grauschleier über die gesamte Activity.

Das funktioniert natürlich am besten, wenn man den AsyncTask auch erst in der Activity erstellt.
Dann kann man sobald der Task fertig ist in der OnPostExecute Methode alle Werte setzen, die man benötigt.

Mit Fragments sollte es eigentlich ähnlich funktionieren, aber die hab ich bisher nie genutzt (Leider bin ich die letzten Monate mehr theoretisch in Android unterwegs weil ich keine Zeit finde selbst zu programmieren ^^).
 
Ähnliche Themen - String[] problem. Laufzeit? Antworten Datum
2
1