当我 运行 我的智能手机上的应用程序出错,但它是正确的 如果我 运行 Android Studio 上的应用程序
Error when I run the app on my smartphone, but its correct If I run the app on Android Studio
当我在 Android Studio 中 运行 我的应用程序时,一切 运行 正确。抽屉中的 ListView 由 运行 RushSearch() 查询正确填充。
但是当我创建了 apk 并安装在我的智能手机上以尝试 运行 该应用程序时,第一个 运行 抽屉中的 ListView 没有填充。如果我关闭应用程序并再次 运行,一切都是正确的。
为什么会出现这种异常情况?
MainActivity.java class onCreate 方法的代码是这样的
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);
}
方法 callWebservice() 负责从 url 中获取一个 JSON 文件,它的代码是这样的
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();
}
如果我 运行 使用 Android Studio 的应用程序,在 AVD 智能手机中,我有这个日志
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
告诉我 sectionList 数组中的元素数是 13(第六行),这是正确的。
app run with Android Studio
如果我创建 apk 并将其安装在我的智能手机上,然后将其插入电脑以在我 运行 应用程序时检查日志,我有此日志
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
这告诉我 sectionList 数组中的元素为 0,但如果我关闭并再次 运行 它,一切都是正确的。
数据下载完成后需要设置抽屉。例如,在下载新部分时调用 saveDate() 并在 onCreate() 中调用 setUpDraw()。
private void saveData(Sections newSections) {
newSections.save()
setUpDraw()
}
private void setUpDraw() {
drawerListView = (ListView) findViewById(R.id.drawer_listView);
sectionsList = new RushSearch().whereEqual("Fk", 0).find(Sections.class);
drawerListViewAdapter = new DrawerListViewAdapter(sectionsList, context); // You don't want application context
drawerListView.setAdapter(drawerListViewAdapter);
drawerListView.setOnItemClickListener(click);
}
我认为你应该调用这部分代码:
// 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);
saveSections() 方法完成后。像这样:
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"));
// 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);
} 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);
}
我修改了我的代码,现在我有了 onCreate()
方法的代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callWebservice();
// setContentView(R.layout.activity_main);
// 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);
setupDrawer();
}
setupDrawer()
方法所在
private void setupDrawer() {
// SELECT * FROM Sections where Fk == 0;
sectionsList = new RushSearch().whereEqual("Fk", 0).find(Sections.class);
Log.d("ELEMENT", "" + 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);
}
如果我在 try-catch saveSections(response.getJSONArray("Sections"));
之后从 onCreate()
或 callWebservice()
调用此方法,我会遇到同样的问题。
好的,伙计。试试这个:
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 {
new SaveData().execute(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);
}
然后将这个内部 class 添加到您的 activity:
private final class SaveData extends AsyncTask<JSONArray, Void, Void> {
protected Void doInBackground(JSONArray... params) {
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");
return null;
}
public void onPostExecute(Void result) {
sectionsList = new RushSearch().whereEqual("Fk", 0).find(Sections.class);
Log.d("ELEMENTI",""+sectionsList.size());
drawerListViewAdapter = new DrawerListViewAdapter(sectionsList, getApplicationContext());
}
}
希望对您有所帮助!
当我在 Android Studio 中 运行 我的应用程序时,一切 运行 正确。抽屉中的 ListView 由 运行 RushSearch() 查询正确填充。 但是当我创建了 apk 并安装在我的智能手机上以尝试 运行 该应用程序时,第一个 运行 抽屉中的 ListView 没有填充。如果我关闭应用程序并再次 运行,一切都是正确的。
为什么会出现这种异常情况?
MainActivity.java class onCreate 方法的代码是这样的
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);
}
方法 callWebservice() 负责从 url 中获取一个 JSON 文件,它的代码是这样的
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();
}
如果我 运行 使用 Android Studio 的应用程序,在 AVD 智能手机中,我有这个日志
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
告诉我 sectionList 数组中的元素数是 13(第六行),这是正确的。 app run with Android Studio 如果我创建 apk 并将其安装在我的智能手机上,然后将其插入电脑以在我 运行 应用程序时检查日志,我有此日志
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
这告诉我 sectionList 数组中的元素为 0,但如果我关闭并再次 运行 它,一切都是正确的。
数据下载完成后需要设置抽屉。例如,在下载新部分时调用 saveDate() 并在 onCreate() 中调用 setUpDraw()。
private void saveData(Sections newSections) {
newSections.save()
setUpDraw()
}
private void setUpDraw() {
drawerListView = (ListView) findViewById(R.id.drawer_listView);
sectionsList = new RushSearch().whereEqual("Fk", 0).find(Sections.class);
drawerListViewAdapter = new DrawerListViewAdapter(sectionsList, context); // You don't want application context
drawerListView.setAdapter(drawerListViewAdapter);
drawerListView.setOnItemClickListener(click);
}
我认为你应该调用这部分代码:
// 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);
saveSections() 方法完成后。像这样:
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"));
// 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);
} 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);
}
我修改了我的代码,现在我有了 onCreate()
方法的代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callWebservice();
// setContentView(R.layout.activity_main);
// 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);
setupDrawer();
}
setupDrawer()
方法所在
private void setupDrawer() {
// SELECT * FROM Sections where Fk == 0;
sectionsList = new RushSearch().whereEqual("Fk", 0).find(Sections.class);
Log.d("ELEMENT", "" + 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);
}
如果我在 try-catch saveSections(response.getJSONArray("Sections"));
之后从 onCreate()
或 callWebservice()
调用此方法,我会遇到同样的问题。
好的,伙计。试试这个:
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 {
new SaveData().execute(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);
}
然后将这个内部 class 添加到您的 activity:
private final class SaveData extends AsyncTask<JSONArray, Void, Void> {
protected Void doInBackground(JSONArray... params) {
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");
return null;
}
public void onPostExecute(Void result) {
sectionsList = new RushSearch().whereEqual("Fk", 0).find(Sections.class);
Log.d("ELEMENTI",""+sectionsList.size());
drawerListViewAdapter = new DrawerListViewAdapter(sectionsList, getApplicationContext());
}
}
希望对您有所帮助!