- Forum-Beiträge: 18
29.10.2020, 13:15:43 via Website
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);
}
}
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.