【发布时间】:2020-07-22 09:48:22
【问题描述】:
我正在尝试显示我的请求的结果,但它在最后执行了请求。 你可以看到日志。
我尝试了 3 种不同的方法
1 - 创建一个扩展 BaseAdapter 的子类 2 - 创建一个 RecycleView.AdapterView 3 - AsyncTask(如果正确,则在“渲染 UI”之前运行请求)
public class MainActivity extends AppCompatActivity {
JSONArray result = new JSONArray();
TextView name, phone, location;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = findViewById(R.id.name);
phone = findViewById(R.id.phone);
location = findViewById(R.id.location);
Log.i("MainActivity","finished with TextViews");
new MyTask().execute(url);
}
private class MyTask extends AsyncTask<String, Void, JSONArray> {
@Override
protected JSONArray doInBackground(String... params) {
Log.i("MainActivity","starting with doInBackground");
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
String url = params[0];
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
result = response;
Log.i("MainActivity",result.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
result.put(error.toString());
}
}
) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> token = new HashMap<>();
token.put("Authorization", "Token *************");
return token;
}
};
requestQueue.add(jsonArrayRequest);
Log.i("MainActivity", "finished with doInBackground");
return result;
}
@Override
protected void onPostExecute(JSONArray result) {
super.onPostExecute(result);
Log.i("MainActivity","stating with onPostExecute");
// do something with result
for(int i = 0; i<result.length(); i++){
try {
name.setText(new JSONObject(result.get(i).toString()).get("seller_name").toString());
phone.setText(new JSONObject(result.get(i).toString()).get("seller_phone").toString());
location.setText(new JSONObject(result.get(i).toString()).get("seller_location").toString());
}catch(JSONException e){
e.printStackTrace();
name.setText("Error");
phone.setText("Error");
location.setText("Error");
}
}
Log.i("MainActivity","finished with onPostExecute");
}
}
public JSONArray doSomeWork(String url_) {
Log.i("MainActivity","starting with doSomeWork");
return result;
}}
日志:
MainActivity:使用 TextViews 完成
MainActivity:以 doInBackground 开头
MainActivity:以 doInBackground 结束
MainActivity:使用 onPostExecute 声明
MainActivity:以 onPostExecute 结束
MainActivity:onResponse 方法返回的数据 - JSON
【问题讨论】:
-
您不需要
AsyncTask进行Volley调用,因为请求是在单独的工作线程中处理的,而不是在 UI 线程上 -
好的,那么我怎样才能将请求中的数据显示到 UI,从我发现需要先完成请求以便我可以在 UI 中呈现数据,如果正确的话我可以这样做吗?
-
我在下面添加了解决方案。