String[] problem. Laufzeit?

S

sugg1

Neues Mitglied
0
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();
    }

}
 
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]
 
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]
 
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:
Poste mal deine Resource, wo du dein Array erstellst.
 
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;
 
Nicht das. ;) Ich meine das xml - file, wo das array R.array.heroes definiert ist.
 
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:
 
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.
 
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.
 
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.
 
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.
 
@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...
 
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:
 
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:
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

W
  • WuDiDong
Antworten
3
Aufrufe
768
jogimuc
J
W
Antworten
16
Aufrufe
844
jogimuc
J
S
Antworten
4
Aufrufe
995
Sempervivum
S
Zurück
Oben Unten