lorsque j'exécute mon application dans Android Studio, tout fonctionne correctement. Le ListView dans le tiroir est correctement rempli en exécutant une requête RushSearch(). Mais quand j'ai créé l'apk et que je l'ai installé sur mon smartphone pour essayer d'exécuter l'application, le ListView in Drawer à la première exécution n'est pas rempli. Si je ferme l'application et la réexécute, tout est correct.Erreur lors de l'exécution de l'application sur mon smartphone, mais c'est correct Si je lance l'application sur Android Studio
Pourquoi cette anomalie?
Le code pour la méthode de la classe onCreate MainActivity.java est ce
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callWebservice();
// Layout principale col drawer
setContentView(R.layout.activity_main_drawer);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
leftArrow = (ImageView) findViewById(R.id.left_arrow);
titolo = (TextView) findViewById(R.id.titolo_id);
ActionBarDrawerToggle actionBarDrawerToggle =
new ActionBarDrawerToggle(this, drawerLayout, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawerLayout.setDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.syncState();
drawerListView = (ListView) findViewById(R.id.drawer_listView);
// SELECT * FROM Sections where Fk == 0;
sectionsList = new RushSearch().whereEqual("Fk", 0).find(Sections.class);
Log.d("ELEMENTI",""+sectionsList.size());
drawerListViewAdapter = new DrawerListViewAdapter(sectionsList, getApplicationContext());
// Adapter che si occupa di popolare il drawer
drawerListView.setAdapter(drawerListViewAdapter);
// Listner per il click su un elemento del drawer
drawerListView.setOnItemClickListener(click);
}
La méthode callWebservice() est responsabile de prendre un fichier JSON à partir d'une URL et son code est cette
private void callWebservice() {
String tag_json_obj = "GetItem";
String url = String.format("http://digitalbox.getsandbox.com/item");
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
saveSections(response.getJSONArray("Sections"));
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Settings", "Error: " + error.getMessage());
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
headers.put("Accept", "application/json");
return headers;
}
};
NetworkController.getInstance().addToRequestQueue(jsonObjectRequest, tag_json_obj);
}
private void saveSections(final JSONArray section) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int c = section.length();
for (int i = 0; i < c; i++) {
try {
JSONObject obj = section.getJSONObject(i);
Sections s = new RushSearch().whereEqual("ID", obj.getInt("ID")).findSingle(Sections.class);
if (s == null) {
s = new Sections();
s.setID(obj.getInt("ID"));
}
if (!obj.isNull("Fk"))
s.setFk(obj.getInt("Fk"));
s.setTitle(obj.getString("Title"));
if (!obj.isNull("CategoryColor"))
s.setCategoryColor(obj.getString("CategoryColor"));
s.setPos(obj.getInt("Pos"));
s.setLanguageId(obj.getInt("LanguageId"));
s.setUnavailableForSend(obj.getBoolean("UnavailableForSend"));
s.save();
} catch (JSONException e) {
e.printStackTrace();
}
}
Log.d("sections", "DB updated");
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
Si je cours l'application avec Android Studio, dans un smartphone AVD, j'ai ce journal
11-30 15:21:53.520 2170-2170/? I/art: Not late-enabling -Xcheck:jni (already on)
11-30 15:21:53.520 2170-2170/? I/art: Late-enabling JIT
11-30 15:21:53.558 2170-2170/? I/art: JIT created with code_cache_capacity=2MB compile_threshold=1000
11-30 15:21:53.685 2170-2170/rawpepper.it.digitalbox W/System: ClassLoader referenced unknown path: /data/app/rawpepper.it.digitalbox-2/lib/x86
11-30 15:21:54.099 2170-2170/rawpepper.it.digitalbox W/art: Before Android 4.1, method int android.support.v7.internal.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
11-30 15:21:54.469 2170-2170/rawpepper.it.digitalbox D/ELEMENT: 13
11-30 15:21:54.486 2170-2210/rawpepper.it.digitalbox D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
11-30 15:21:54.592 2170-2210/rawpepper.it.digitalbox I/OpenGLRenderer: Initialized EGL, version 1.4
11-30 15:21:54.719 2170-2210/rawpepper.it.digitalbox W/EGL_emulation: eglSurfaceAttrib not implemented
11-30 15:21:54.719 2170-2210/rawpepper.it.digitalbox W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad6fc2e0, error=EGL_SUCCESS
11-30 15:21:57.542 2170-2204/rawpepper.it.digitalbox D/Volley: [117] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://digitalbox.getsandbox.com/item 0x95b78f5f NORMAL 1> [lifetime=3034], [size=196862], [rc=200], [retryCount=0]
11-30 15:21:57.691 2170-2180/rawpepper.it.digitalbox W/art: Suspending all threads took: 25.964ms
11-30 15:21:57.909 2170-2405/rawpepper.it.digitalbox D/sections: DB updated
qui me dit que le nombre d'éléments dans le tableau sectionList est 13 (sixième rangée), c'est correct. app run with Android Studio Si je crée l'apk et je l'installe sur mon smartphone, et je branche ce sur PC pour vérifier le journal quand je lance l'application, j'ai ce journal
11-30 15:35:01.765 17183-17183/rawpepper.it.digitalbox I/art: Late-enabling -Xcheck:jni
11-30 15:35:01.883 17183-17183/rawpepper.it.digitalbox W/System: ClassLoader referenced unknown path: /data/app/rawpepper.it.digitalbox-2/lib/arm
11-30 15:35:02.357 17183-17183/rawpepper.it.digitalbox W/art: Before Android 4.1, method int android.support.v7.internal.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
11-30 15:35:03.235 17183-17183/rawpepper.it.digitalbox D/ELEMENT: 0
11-30 15:35:03.249 17183-17260/rawpepper.it.digitalbox D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
11-30 15:35:03.304 17183-17260/rawpepper.it.digitalbox I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 09/02/15, 76f806e, Ibddc658e36
11-30 15:35:03.306 17183-17260/rawpepper.it.digitalbox I/OpenGLRenderer: Initialized EGL, version 1.4
11-30 15:35:05.976 17183-17321/rawpepper.it.digitalbox D/sections: DB updated
qui me dit que les éléments sectionList array est 0, mais si je le ferme et l'exécute à nouveau, tout est correct.
Sans lire après la 3ème ligne de code, je devine que 'callWebservice();' est utilisé pour remplir le tiroir. Donc, vous devez attendre la réponse et le charger puis – codeMagic
le tiroir est rempli dans la méthode onCreate avec cette ligne de code 'sectionsList = new RushSearch(). WhereEqual (" Fk ", 0) .find (Sections.class); Log.d ("ELEMENTI", "" + sectionsList.size()); drawerListViewAdapter = new DrawerListViewAdapter (sectionsList, getApplicationContext()); ' – Dennis
oui mais vous n'êtes pas sûr que les informations que vous recherchez sont stockées. L'appel au service Web est asynchrone, il est donc possible que vous essayez de lire les données qui ne sont pas déjà reçues du service Web – baki