zweifach Laden Bug

  • Antworten:19
  • Bentwortet
Neggorok
  • Forum-Beiträge: 18

29.10.2020, 13:15:43 via Website

Moin moin!

Ich komm direkt zum Problem, ich schlage mich jetzt seit mehreren Wochen mit einem, wie ich ursprünglich dachte, kleinen Bug herum, der dafür sorgt, dass ich bei einem swipe refresh layout immer mehrfach swipen muss, bis der neue Wert in meiner App ankommt.

Als ich diesen Bug nun vor einigen Tagen beheben wollte stellte ich fest, dass er immer auftritt, wenn Daten überschrieben werden, also gar nicht so klein ist wie ich dachte.

Als kleine Information vorweg, ich habe mir das programmieren von Apps bisher aus verschiedenen Guides und Erklärungen alleine beigebracht, manche Codebereiche werden also sicher nicht "dem Standard" entsprechen und auch mit manchen Begrifflichkeiten werde ich wahrscheinlich nichts anfangen können, seid also bitte lieb zu mir ;)

Ich werde einfach mal eine Beispielklasse dazupacken, vllt fällt ja jemandem etwas auf :)
vielen Dank schonmal lg Neggo

PS: Ich habe Kommentare, die nur für mich interessant sind entfernt und an einigen Stellen Notizen gemacht. Die Notizen würde ich erweitern, je nach dem was ich bereits ausprobiert habe.

PPS: Wie ich bei meinen letzten Tests feststellte, scheint die Reihenfolge, mit der das Programm abgearbeitet wird ein Problem zu sein, möglicherweise fehlt mir hier eine Grundlage die mir hier ein Bein stellt :/

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.prefs.PreferenceChangeEvent;

// TrainingsabschnittActivity
public class TaskListActivity extends AppCompatActivity {

int loggedInUserID;
int loggedInUserscore;
int refreshedUserscore;
int refreshedUserTear;
int loggedInUserTear;
String loggedInUsername;




private TaskListAdapter adapter;
private List<Task> taskList;

TextView currentUserscoreTV;
TextView currentUserTearTV;
RecyclerView taskRecyclerView;
SwipeRefreshLayout swipeRefreshLayout;

RequestQueue queue;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_task_list);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

 // hier werden die Daten vom Server geholt, durch das Debuggen weiß ich, dass die richtigen Werte enthalten sind.
    loggedInUserID = PreferenceManager.getDefaultSharedPreferences(this).getInt("kundenID", -1);
    loggedInUserscore = PreferenceManager.getDefaultSharedPreferences(this).getInt("userScore", -1);
    loggedInUsername = PreferenceManager.getDefaultSharedPreferences(this).getString("username", "-1");
    loggedInUserTear = PreferenceManager.getDefaultSharedPreferences(this).getInt("userTear", -1);

    currentUserscoreTV = (TextView) findViewById(R.id.userScoreTV);
    currentUserTearTV = (TextView) findViewById(R.id.userTearTV);

    taskList = new ArrayList<>();
    adapter = new TaskListAdapter(this, taskList);
    taskRecyclerView = (RecyclerView) findViewById(R.id.taskListRecyclerView);
    taskRecyclerView.setHasFixedSize(true);
    taskRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    taskRecyclerView.setAdapter(adapter);

    queue = Volley.newRequestQueue(this);

// swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
// swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
// @Override
// public void onRefresh() {
// // legt fest, was beim swipen refresht wird
// loadUserScore();
//
//
// // beendet die optische Laderückgabe - also den sich drehenden Preil
// swipeRefreshLayout.setRefreshing(false);
// }
// });

    loadUserScore();
    loadTaskList();
}



public void loadUserScore() {

    String create_user_url = getString(R.string.XAMPP) + "/ScoreRefresh.php";

    StringRequest postRequest = new StringRequest(Request.Method.POST, create_user_url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {


                    Log.i("response", response);

                    try {
                        JSONObject jsonResponse = new JSONObject(response);

                        int success = Integer.parseInt(jsonResponse.get("success").toString());
                        if (success == 1) {

                           PreferenceManager.getDefaultSharedPreferences(TaskListActivity.this).edit().putInt("userScore", jsonResponse.getInt("refreshed_score")).apply();
                            PreferenceManager.getDefaultSharedPreferences(TaskListActivity.this).edit().putInt("userTear", jsonResponse.getInt("user_tear")).apply();

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }



                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    }){
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("aUsername", loggedInUsername);

            return params;
        }
    };

// Ich weiß, dass die Shared prefs nicht richtig aufgebaut sind, da sie aber Grundsätzlich tun was sie sollen, habe ich dieses Problem ersteinmal hinten angehängt
refreshedUserscore = PreferenceManager.getDefaultSharedPreferences(this).getInt("userScore", -1);
refreshedUserTear = PreferenceManager.getDefaultSharedPreferences(this).getInt("userTear", -1);

    SharedPreferences SPRefreshedUserscore = getSharedPreferences(String.valueOf(refreshedUserscore), Activity.MODE_PRIVATE);

    String setUserscore = SPRefreshedUserscore.getString("", String.valueOf(refreshedUserscore));

    SharedPreferences SPRefreshedUserTear = getSharedPreferences(String.valueOf(refreshedUserTear), Activity.MODE_PRIVATE);
    String setUserTear = SPRefreshedUserTear.getString("", String.valueOf(refreshedUserTear));

// hier liegt das aktuelle Problem, die Daten die hier hereingeschrieben werden sollten, kommen aus der oben ausgeführten RefreshScore.php, diese liefert auch brav die Daten in der App ab, allerdings erst nachdem die App fertig geladen ist, ich muss also nocheinmal swipen bzw laden bis die Daten auch angezeigt werden

    currentUserscoreTV.setText(setUserscore);
    currentUserTearTV.setText(setUserTear);


    queue.add(postRequest);

}


public void loadTaskList() {

    taskList.clear();
    String create_user_url = getString(R.string.XAMPP) + "/GetAllTasks.php";

    StringRequest postRequest = new StringRequest(Request.Method.POST, create_user_url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {


                    Log.i("response", response);

                    try {
                        JSONObject jsonResponse = new JSONObject(response);
                        JSONArray taskArray = (JSONArray) jsonResponse.get("task");


                        for (int taskObjekte = 0; taskObjekte < taskArray.length(); taskObjekte++) {
                            JSONObject taskJson = taskArray.getJSONObject(taskObjekte);

                            taskList.add(new Task(taskJson.getString("taskname")));
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    adapter.notifyDataSetChanged();


                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    }){
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("usertear", String.valueOf(loggedInUserTear));

            return params;
        }
    };

    queue.add(postRequest);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_task_list, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if(id == R.id.profile) {
        Intent i = new Intent(getApplicationContext(), ProfileActivity.class);
        startActivity(i);
    }
    return super.onOptionsItemSelected(item);
}

}

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.527

29.10.2020, 19:32:09 via Website

"Die beiden Zeilen führst du aus noch bevor du überhaupt deinen Request abschickst.

currentUserscoreTV.setText(setUserscore);
currentUserTearTV.setText(setUserTear);
queue.add(postRequest);

in der onCreate() --> loadUserScore() Methode (MainThread) führst du diese Zeilen aus.
Die ersten sollen deine Ausgabe auf dem Bildschirm machen.
Die dritte startet das laden aus dem Netzt. Die Anzeige mit alten falschen Daten ist lange erledigt wenn die richtigen neuen Daten in der onResponse Methode ankommen.

In der onResponse speicherst du die Daten zwar in den Pref aber anzeigen tust du sie nicht.

Die onResponse ist dein Listener der aufgerufen wird wenn die Daten da sind.
Also hier und erst jetzt solltest du eine Ausgabe machen.Wenn es viele Daten sind und es lange dauern kann würde ich einen Verkaufs Balken einblenden der anzeigt das Daten geladen werden.

Zu deinem jetzigen Ablauf.
Bei einen späteren Zeitpunkt nach einigen swipe sind die Daten da und in den Prefs gespeichert. Deshalb kannst du sie nun auch nach den laden der Prefs in der onCreate auch ausgeben und auf dem Bildschirm sehen.
Das kommt deinen sogenannten neu einloggen gleich. Denn was machst du du holst alte Daten aus den pref u d zeigst sie an. Beim Start auch richtig aber zwischen durch eben nicht.

Hoffe es ist jetzt einigermaßen verstanden.

— geändert am 29.10.2020, 20:38:11

Hilfreich?
Neggorok
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

29.10.2020, 15:56:46 via Website

Hallo

Wenn du willst das die aus dem Netz geladen Daten auch nach dem laden in die Pref geschrieben werden musst du das auch in dem Response Listener von Volley machen.
Auch das Anzeigen der Daten wir vorher nicht gehn.

Das laden der Daten aus dem Netz findend asynchron in einem eigenen Thread mit Volley statt und in der Response Methode kommen die Daten an wenn sie fertig geladen wurden.
Also musst du auch zu diesem Zeitpunkt die Daten speichern, oder Anzeigen.

Es sind drei Threads die parallel laufen.
Main, und der scorerefrech.php, und getalltasks.php
Die laufen parallel ab.

Wenn du die Daten aus dem Netz auch auf dem Bildschirm anzeigen willst musst du das auch in dem Listener machen. Von wo sie kommen.

Die beiden Zeilen führst du aus noch bevor du überhaupt deinen Request abschickst.
Kann nicht gehen . Denke zeitlich. Parallel.

currentUserscoreTV.setText(setUserscore);
currentUserTearTV.setText(setUserTear);

Ps. das ist kein Bug von Android sondern ein Fehler deinerseits. Multithreading.

— geändert am 29.10.2020, 16:59:32

Hilfreich?
Kommentieren
Neggorok
  • Forum-Beiträge: 18

29.10.2020, 18:18:55 via Website

also die Daten werden geladen, wenn ich mich sozusagen frisch einlogge, dann bekomme ich alle daten genau so angezeigt wie ich sie haben möchte, sowohl den Score als auch den tear. Erst wenn sich dei Daten auf dem Server danach ändern und man die Daten durch den swipe refreschen will, tritt der bug auf. Also das Anzeigen der Daten an sich funktioniert.

Ok, das mit dem Ablauf hatte ich befürchtet, ich dachte das Die einzelnen Methoden nacheinander ausgeführt werden.

"Wenn du die Daten aus dem Netz auch auf dem Bildschirm anzeigen willst musst du das auch in dem Listener machen. Von wo sie kommen." - Da weiß ich leider nicht genau was du meinst, kannst du das vllt genauer erklären?

"Die beiden Zeilen führst du aus noch bevor du überhaupt deinen Request abschickst.
Kann nicht gehen . Denke zeitlich. Parallel." - das ist eine sehr gute Information, das hatte ich zwar schon beobachtet aber nicht verstanden... Da sich die beiden Zeilen ja noch in der Methode befinden klingt es sofort logisch, da der request aber schon abgeschlossen ist, also so rein von den Klammern her - sorry wenn ich das so Leihenhaft ausdrücke :) - dachte ich auch diese beiden Zeilen würden nach dem Request ausgeführt werden.
Dann stellt sich mir die Frage, wo muss ich die beiden Zeilen denn unterbringen, dass sie in der Methode, aber nach dem Request verarbeitet werden?

"Ps. das ist kein Bug von Android sondern ein Fehler deinerseits. Multithreading." - das habe ich auch nie behauptet

Ich sage schonmal danke für die schnelle Antwort :) Ich lasse diese Infos bis morgen mal auf mich wirken, vllt macht es dann sofort klick. Wenn noch Jemand ne Idee hat, würde ich mich auch über weitere Ideen oder Anmerkungen freuen :)

Lg Neggo

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.527

29.10.2020, 19:32:09 via Website

"Die beiden Zeilen führst du aus noch bevor du überhaupt deinen Request abschickst.

currentUserscoreTV.setText(setUserscore);
currentUserTearTV.setText(setUserTear);
queue.add(postRequest);

in der onCreate() --> loadUserScore() Methode (MainThread) führst du diese Zeilen aus.
Die ersten sollen deine Ausgabe auf dem Bildschirm machen.
Die dritte startet das laden aus dem Netzt. Die Anzeige mit alten falschen Daten ist lange erledigt wenn die richtigen neuen Daten in der onResponse Methode ankommen.

In der onResponse speicherst du die Daten zwar in den Pref aber anzeigen tust du sie nicht.

Die onResponse ist dein Listener der aufgerufen wird wenn die Daten da sind.
Also hier und erst jetzt solltest du eine Ausgabe machen.Wenn es viele Daten sind und es lange dauern kann würde ich einen Verkaufs Balken einblenden der anzeigt das Daten geladen werden.

Zu deinem jetzigen Ablauf.
Bei einen späteren Zeitpunkt nach einigen swipe sind die Daten da und in den Prefs gespeichert. Deshalb kannst du sie nun auch nach den laden der Prefs in der onCreate auch ausgeben und auf dem Bildschirm sehen.
Das kommt deinen sogenannten neu einloggen gleich. Denn was machst du du holst alte Daten aus den pref u d zeigst sie an. Beim Start auch richtig aber zwischen durch eben nicht.

Hoffe es ist jetzt einigermaßen verstanden.

— geändert am 29.10.2020, 20:38:11

Hilfreich?
Neggorok
Kommentieren
Neggorok
  • Forum-Beiträge: 18

30.10.2020, 13:15:39 via Website

Ich danke dir vielmals für diese genaue Erklärung :)

Ich habe den Codeschnipsel, der dafür sorgt, dass die Daten der Preferences in den TextViews landen in den Try-Catch Bereich verschoben, nun möchte er da den Context haben.

Den Context "this" scheint er nicht zu mögen und auch die Klasse.this wie im Response der Context definiert wird will hier nicht passen, weißt du wieso das so ist, bzw. was ich dort eintragen muss?

     refreshedUserscore = PreferenceManager.getDefaultSharedPreferences(this).getInt("userScore", -1);

Ich hoffe du entschuldigst diese Fragen, ich habe versucht das Problem über Bücher und Google zu lösen, das Problem ist dass ich nicht recht weiß wonach ich suchen soll :/

Aber Ich danke vielmals, dass Ihr euch mit meinem Problem beschäftigt :)

Lg Neggo

— geändert am 30.10.2020, 13:15:59

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

30.10.2020, 13:43:03 via Website

Ich hoffe du entschuldigst diese Fragen, ich habe versucht das Problem über Bücher und Google zu lösen, das Problem ist dass ich nicht recht weiß wonach ich suchen soll :/

Dir fehlt es OOP an Grundlagen - da hilft auch leider Google nicht.

Man kann auch jetzt nicht erkennen, an welcher Stelle du deinen Context benötigst und wie man den an dieser Stelle sinnvoll ermittelt.
(z.b. final Static in einem Listener Callback etc etc)

— geändert am 30.10.2020, 13:43:54

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Neggorok
  • Forum-Beiträge: 18

30.10.2020, 13:59:07 via Website

Ich poste einfach nochmal kurz die Methode, wie sie aktuell aussieht, und mache ne Markierung dran, wo er meckert, vllt ist es dann offensichtlicher :)

Edit: Wenn statt "this" - "TaskListActivity.this" eingetragen wird, kommt als Rückmeldung "this is not available", Ich versuche diese Info zu googeln, aber bisher hatte ich leider nur mäßig Erfolg :/, vllt hilft euch diese Info ja weiter

Edit2: Ich habe gerade festgestellt, das das, was ich da unten versuche, "TaskListActivity.this" - funktioniert... Ich habe es die ganze Zeit im Debugger versucht und nur auf die "Fehler" geachtet und nicht auf die Ausgabe, die , wie ich gerade feststellen durfte, funktioniert.
Nun ist die Frage, seht ihr da immernoch Fehler, also funktioniert es nur durch Zufall und als 2. Frage, wieso sagt er mir das "refreshedUserscore = this is not available" im Debugmode?

Ja das mir Grundlagen fehlen hatte ich ja gesagt, aber ich arbeite dran :D

public void loadUserScore() {

    String create_user_url = getString(R.string.XAMPP) + "/ScoreRefresh.php";

    StringRequest postRequest = new StringRequest(Request.Method.POST, create_user_url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {


                    Log.i("response", response);

                    try {
                        JSONObject jsonResponse = new JSONObject(response);


                        int success = Integer.parseInt(jsonResponse.get("success").toString());
                        if (success == 1) {


                            PreferenceManager.getDefaultSharedPreferences(TaskListActivity.this).edit().putInt("userScore", jsonResponse.getInt("refreshed_score")).apply();
                            PreferenceManager.getDefaultSharedPreferences(TaskListActivity.this).edit().putInt("userTear", jsonResponse.getInt("refreshed_tear")).apply();

------------------------------------------------------------------------

    refreshedUserscore = PreferenceManager.getDefaultSharedPreferences(this).getInt("userScore", -1);

------------------------------------------------------------------------

                         refreshedUserTear = PreferenceManager.getDefaultSharedPreferences(this).getInt("userTear", -1);





                            SharedPreferences SPRefreshedUserscore = getSharedPreferences(String.valueOf(refreshedUserscore), Activity.MODE_PRIVATE);

                            String setUserscore = SPRefreshedUserscore.getString("", String.valueOf(refreshedUserscore));

                            SharedPreferences SPRefreshedUserTear = getSharedPreferences(String.valueOf(refreshedUserTear), Activity.MODE_PRIVATE);
                            String setUserTear = SPRefreshedUserTear.getString("", String.valueOf(refreshedUserTear));

                            currentUserscoreTV.setText(setUserscore);
                            currentUserTearTV.setText(setUserTear);


                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }



                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    }){
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("aUsername", loggedInUsername);

            return params;
        }
    };


    queue.add(postRequest);

}

— geändert am 30.10.2020, 15:39:17

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

30.10.2020, 16:03:26 via Website

Ganz oben

private Activity mActivity;

In onCreate :

mActivity = this:

im Callback :

mActivity anstatt "this"

P.S Mit Fragmenten können wir nichts Anfangen. Ich gehe mal bei der obigen Lösung davon aus , dass deine public void loadUserScore() in der MainActivity ist.

Ansonsten musst du dir den Constructor in einer SubKlasse hernehmen.

P.S.2 Dein Code ist veralteter Stil, haste Copy & Paste gemacht , richtig ? :-)

— geändert am 30.10.2020, 16:08:42

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Jokel
Kommentieren
Neggorok
  • Forum-Beiträge: 18

30.10.2020, 16:37:53 via Website

Ich werd mir auf jedenfall einige Grundlagen ansehen, aber danke für all eure Antworten =)

Öh ne. ich hab mir das aus verschiedenen Guides und Threads aus dem Netz zusammen gebastelt, jenachdem was ich einbauen wollte habe ich Erklärungen gesucht und eingebaut. Aber das da veraltete Teile drin sind ist mir schon öfter aufgefallen, ich behebe stück für stück, wenn ich bessere Lösungen finde^^

— geändert am 30.10.2020, 17:16:00

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

30.10.2020, 16:47:52 via Website

Du befindest dich in einer Callback Methode. Das einfache „this“ zeigt hier auf die Callback Methode selber und nicht auf die Klasse oder die Activity.
Du solltest dir anschauen und verstehen was „this „ ist oder besser wo der Zeiger this hin zeigt.

Außerdem verstehe ich nicht warum du es überhaupt so kompliziert machst.
In dem Listener speicherst du die beiden werte in den Prefs auch richtig.
Aber warum gehst du den Umweg die Daten in der gleichen Methode auch wider aus den Prefs zu lesen. Die ausgelesen werte anzuzeigen. Das ist doppelt gemoppelt.
Du hast doch alles in dem Respose String.

Das zeigt mir das du deinen eigenen Code nicht verstehst ,ihm einfach aus dem Netz holst ohne großartig darüber nach zudenken was der macht.

Einfacher

public void onResponse(String response) {

                Log.i("response", response);

                try {
                    JSONObject jsonResponse = new JSONObject(response);

                    int success = Integer.parseInt(jsonResponse.get("success").toString());
                    if (success == 1) {

                        PreferenceManager.getDefaultSharedPreferences(TaskListActivity.this).edit().putInt("userScore", jsonResponse.getInt("refreshed_score")).apply();
                        PreferenceManager.getDefaultSharedPreferences(TaskListActivity.this).edit().putInt("userTear", jsonResponse.getInt("refreshed_tear")).apply();

                        currentUserscoreTV.setText(""+jsonResponse.getInt("refreshed_score"));
                        currentUserTearTV.setText(""+jsonResponse.getInt("refreshed_tear"));


                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }

@saw00 Die gesammte Klasse hat er am Anfang Gepostet

Ich gehe mal bei der obigen Lösung davon aus , dass deine public void loadUserScore() in der MainActivity ist.

Ja das ist auch im erten Post zu sehen.

— geändert am 30.10.2020, 17:05:59

Hilfreich?
swa00
Kommentieren
Neggorok
  • Forum-Beiträge: 18

30.10.2020, 17:01:00 via Website

  • ja, steht auf meiner Todo.

  • Mir ist durchaus bewusst, dass der Code da doppelt gemoppelt ist, bisher habe ich es aber nicht hinbekommen es kürzer zufassen, da meist Fehler in der Syntax auftraten, daher also danke für das Beispiel, ich werde mir mal ansehen ob das funktioniert.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

30.10.2020, 17:11:03 via Website

Nicht nur in der Syntax.

Viel mehr in der logik deinerseits.

Hilfreich?
Kommentieren
Neggorok
  • Forum-Beiträge: 18

30.10.2020, 18:16:06 via Website

Es klingt als würdest du da viel anders aufziehen.

Ich bringe mir den Kram gerade selber bei, da ist eben noch nicht alles sauber wie aus dem Lehrbuch. An welcher Stelle würdest du denn ansetzen um da Ordnung rein zu bringen?

— geändert am 30.10.2020, 18:58:16

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

30.10.2020, 18:50:37 via Website

Hallo
Hast du dir eigentlich mal überlegt was diese beiden Zeilen bewirken?
Ich denke nein.

  SharedPreferences SPRefreshedUserscore = getSharedPreferences(String.valueOf(refreshedUserscore), Activity.MODE_PRIVATE);

Was machst du da, du erstellt eine neue Sharedpref Datei die genau so heißt wie der Wert in der Variablen. Wozu soll das gut sein?

String setUserscore = SPRefreshedUserscore.getString("", String.valueOf(refreshedUserscore));

Jetzt erstellt du eine String Variable, der du aus der eben erstellten Pref Datei, den nicht vorhandenen Key „“ zuweisen willst.
Da der Key nicht vorhanden ist wird der default Wert der String Variablen zugewiesen.

Was hättest du einfacher machen können? Um das gleiche zu erreichen.

Denke darüber mal nach bevor du wider einfach nur kopierst. Thema Grundlagen.

— geändert am 30.10.2020, 20:25:21

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

30.10.2020, 19:41:48 via Website

Ich bringe mir den Kram gerade selber bei, da ist eben noch nicht alles sauber wie aus dem Lehrbuch. An welcher Stelle würdest du denn ansetzen um da Ordnung rein zu bringen?

Grundlagen lernnen Java und OOP.

Doku von Android lesen von den verwendeten Methoden wenn du sie noch nicht kennst.
Verstehen was sie machen.

Schaue mein Beispiel mit deinen ShPrefs. Da hast du noch nicht verstanden was die beiden android methoden machen.

Verstehen was ein Listener ist, was ein Thread ist, was eine CallBack Methode ist......
Wie man Typ Umwandlungen machen kann z.B. Int in String.

Ps. Wenn es für dich nur "Kram" ist dann lasse es lieber sein.
Kaufe dir ein Java und Anfänger Android Buch.

— geändert am 30.10.2020, 20:30:03

Hilfreich?
Kommentieren
Neggorok
  • Forum-Beiträge: 18

30.10.2020, 22:33:45 via Website

joar, danke für die Tipps.
Dein Tonfall und manche Sprüche hättest du dir kneifen können. Aber es ist Freitag, vllt warst du betrunken oder hattest einen scheiß Tag, kann mal passieren.

Ich wünsch noch nen schönen Abend. Man schreibt sich ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

30.10.2020, 22:59:27 via Website

Wer der Meinung ist das es alles nur Kram ist.

Muss sich über Kritik nicht wundern.

Betrunken bin oder war ich bestimmt nicht sonnst hätte ich dir bestimmt nicht geholfen.

— geändert am 30.10.2020, 23:00:50

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

31.10.2020, 07:20:35 via Website

Hallo noch etwas bei deinen vorherigen Thread
https://www.nextpit.de/forum/811005/befuellen-einer-sharedpreference#3368915

Wurde dir auch schon gesagt was du falsch machst.

Auch da ist deine letzte selbst einschätzung falsch.
Du versuchst es zwar mit deinen eigenen Worten zu erklären aber falsch.

Dann kommt natürlich sowas wie hier raus.

Viel Spaß und Erfolg noch.

— geändert am 31.10.2020, 07:24:09

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

31.10.2020, 09:43:58 via Website

Neggorok

joar, danke für die Tipps.
Dein Tonfall und manche Sprüche hättest du dir kneifen können. Aber es ist Freitag, vllt warst du betrunken oder hattest einen scheiß Tag, kann mal passieren.

Ich wünsch noch nen schönen Abend. Man schreibt sich ;)

Nein , hier ist keiner Besoffen und auch ist der "Tonfall" eindeutig von Dir provoziert.
Du erweckst nämlich den Eindruck : "Ach alles halb so wichtig , ich schuster mal zusammen und wenns nicht klappt, frage ich mal die anderen Jungs, wo ich Mist gebaut habe.

Das kann man vergleichen mit : "Ich zieh mal die Mauer hoch , ich weis zwar, dass die schief wird, aber die Anderen werden mir das Ding schon wieder gerade machen und ich stehe mal daneben und schau zu.

Wer sein eigenes Projekt nicht Ernst nimmt, kann auch nur kurze Antworten erwarten.
(Siehe meine)

Ist dir eigentlich bewusst , wieviel Zeit man (Jokel) hier braucht, um sich durch deinen Source durchzuwühlen, um dir eine Antwort geben zu können ? - Der ist wohlbemerkt ziemlich guselig !
Ich schätze mal, dass Jokel mehr als eine Stunde für dich investiert hat. - und dann so flache Antworten Deinerseits ? Und Jokel ist Profi und hat bestimmt auch Anderes in seiner wertvollen Freizeit zu tun.

Ich komm direkt zum Problem, ich schlage mich jetzt seit mehreren Wochen mit einem, wie ich ursprünglich dachte, kleinen Bug herum,

Da ist der Punkt , du brauchst Wochen ohne Ergebnis, erwartest aber hier eine Lösung innerhalb
kürzester Zeit. Lesen einer API-Doku scheint eindeutig nicht deine Stärke zu sein.

Zumal für einen Anfänger dein Vorhaben zu komplex ist - du wirst bald in die Sackgasse rennen.
Da fehlt so Einiges , damit es stabil läuft - alleine, da eine Logik und Konzept komplett fehlen.

Fange bitte Vorne und nicht Hinten an - das geht schief .

— geändert am 31.10.2020, 17:27:48

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.Jokel
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.10.2020, 18:38:58 via Website

Ich kann den beiden nur zustimmen.
Jetzt geht es aber bitte zum eigentlichen Thema zurück.
Hier noch zwei (ernstgemeinte) Links:
https://developer.android.com/training/data-storage/shared-preferences
http://www.willemer.de/informatik/android/sharedpref.htm

Wenn du aber keine Lust hast zu lesen, und die neuen Erkenntnisse in deinen Code einzuarbeiten, dann bist du hier falsch.
Wir helfen gerne weiter, wenn es hängt, aber die eigentliche Arbeit ist auf deiner Seite.

LG

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

Hilfreich?
swa00Jokel
Kommentieren