通过Volley获取数据后Listview为空?
Listview is empty after getting data through Volley?
我只是在做一个基本的异步任务,通过 Volley 库获取数据。我面临的问题是,即使 arrayList 包含一些值,listview 也总是空的。
public class MainActivity extends AppCompatActivity {
String url = "...";
String tag_json_obj = "json_obj_req";
ProgressDialog pDialog;
String TAG = MainActivity.class.getSimpleName();
ListView listView;
ArrayList<String> stringArrayList;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
stringArrayList = new ArrayList<String>();
new Volleyoperation().execute();
}
public class Volleyoperation extends AsyncTask<Void, Void, ArrayList<String>> {
ArrayList<String> arrayList = new ArrayList<>();
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle("Volley Operation");
pDialog.setMessage("Loading...");
pDialog.show();
}
@Override
public ArrayList<String> doInBackground(Void... voids) {
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
url, (String)null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
try {
JSONArray jsonArray = response.getJSONArray("posts");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject object = jsonArray.getJSONObject(i);
Log.d("track", "" + object.getString("title_plain"));
stringArrayList.add(object.getString("title_plain"));
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.d("track", "done");
// pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
VolleyLog.d(TAG, "error msg" +error.networkResponse);
Log.d("track", "Error");
if(error.networkResponse == null){
Log.d("track","Time out");
}
// hide the progress dialog
// pDialog.hide();
}
});
jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
return stringArrayList;
}
@Override
protected void onPostExecute(ArrayList<String> result) {
super.onPostExecute(result);
Log.d("trrrrr", "on post execute");
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, stringArrayList);
listView.setAdapter(adapter);
pDialog.hide();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Logcat :
08-09 14:46:26.820 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Monsoon mocktails
08-09 14:46:26.820 3207-3207/com.yuvaraj.volleytutorial D/track﹕ MANDAVELLI MARKET
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Full Volume – Musical Game and Karaoke Night
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Bake frost and decorate fondant cake
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Purasawalkam Food Ride
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ LIFESTYLE SHOPPING FEST 2015
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ DANCE FOR LIFE
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Act Fast
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Yes, I Will – The Stage Fright Cure Workshop
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Murphy’s Wedding
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ done
我找不到哪里出错了。
您正在异步方法中使用异步方法,因此您无需等待 AsyncTask 中的结果。
JsonObjectRequest 已经是一个异步方法,您只需使用相应的回调 onResponse
和 onErrorResponse
来调度结果。
TLDR;在此特定示例中,不要将 AsynTask 与异步网络请求一起使用
您使用了两种 Asynchronous
方法,所以 ListView
没有显示任何数据。
只用一个Async Task
正如 Simon 的回答,您无需等待数组列表填满即可设置适配器。
这可以通过将 Json 解析从 doInBackground
方法移动到 onPostExecute
方法来解决。并在 onResponse
方法中设置适配器。
无论如何,这是一个更好的做法。
我只是在做一个基本的异步任务,通过 Volley 库获取数据。我面临的问题是,即使 arrayList 包含一些值,listview 也总是空的。
public class MainActivity extends AppCompatActivity {
String url = "...";
String tag_json_obj = "json_obj_req";
ProgressDialog pDialog;
String TAG = MainActivity.class.getSimpleName();
ListView listView;
ArrayList<String> stringArrayList;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView);
stringArrayList = new ArrayList<String>();
new Volleyoperation().execute();
}
public class Volleyoperation extends AsyncTask<Void, Void, ArrayList<String>> {
ArrayList<String> arrayList = new ArrayList<>();
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle("Volley Operation");
pDialog.setMessage("Loading...");
pDialog.show();
}
@Override
public ArrayList<String> doInBackground(Void... voids) {
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
url, (String)null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
try {
JSONArray jsonArray = response.getJSONArray("posts");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject object = jsonArray.getJSONObject(i);
Log.d("track", "" + object.getString("title_plain"));
stringArrayList.add(object.getString("title_plain"));
}
} catch (JSONException e) {
e.printStackTrace();
}
Log.d("track", "done");
// pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
VolleyLog.d(TAG, "error msg" +error.networkResponse);
Log.d("track", "Error");
if(error.networkResponse == null){
Log.d("track","Time out");
}
// hide the progress dialog
// pDialog.hide();
}
});
jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
return stringArrayList;
}
@Override
protected void onPostExecute(ArrayList<String> result) {
super.onPostExecute(result);
Log.d("trrrrr", "on post execute");
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, stringArrayList);
listView.setAdapter(adapter);
pDialog.hide();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Logcat :
08-09 14:46:26.820 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Monsoon mocktails
08-09 14:46:26.820 3207-3207/com.yuvaraj.volleytutorial D/track﹕ MANDAVELLI MARKET
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Full Volume – Musical Game and Karaoke Night
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Bake frost and decorate fondant cake
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Purasawalkam Food Ride
08-09 14:46:26.821 3207-3207/com.yuvaraj.volleytutorial D/track﹕ LIFESTYLE SHOPPING FEST 2015
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ DANCE FOR LIFE
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Act Fast
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Yes, I Will – The Stage Fright Cure Workshop
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ Murphy’s Wedding
08-09 14:46:26.822 3207-3207/com.yuvaraj.volleytutorial D/track﹕ done
我找不到哪里出错了。
您正在异步方法中使用异步方法,因此您无需等待 AsyncTask 中的结果。
JsonObjectRequest 已经是一个异步方法,您只需使用相应的回调 onResponse
和 onErrorResponse
来调度结果。
TLDR;在此特定示例中,不要将 AsynTask 与异步网络请求一起使用
您使用了两种 Asynchronous
方法,所以 ListView
没有显示任何数据。
只用一个Async Task
正如 Simon 的回答,您无需等待数组列表填满即可设置适配器。
这可以通过将 Json 解析从 doInBackground
方法移动到 onPostExecute
方法来解决。并在 onResponse
方法中设置适配器。
无论如何,这是一个更好的做法。