Android 从doInBackground获取数据时遇到问题
我的代码工作有问题,因为UI线程做了很多工作。我必须执行一个异步任务来获取JSON数据 我的问题是,我无法从包含所有getter和setter的类中获取数据。我是Android开发新手Android 从doInBackground获取数据时遇到问题,android,json,asynchronous,Android,Json,Asynchronous,我的代码工作有问题,因为UI线程做了很多工作。我必须执行一个异步任务来获取JSON数据 我的问题是,我无法从包含所有getter和setter的类中获取数据。我是Android开发新手 public class LoadPoliceData extends AsyncTask<URL,Void,Void>{ @Override protected void onPreExecute() { super.
public class LoadPoliceData extends AsyncTask<URL,Void,Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
ProgressDialog pDialog = new ProgressDialog(MapsActivity.this);
pDialog.setMessage("Loading Map");
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected Void doInBackground(URL... urls) {
//TODO: don't fetch twice could cause bug
Bundle extras = getIntent().getExtras();
double latitude = extras.getDouble("latitude");
double longitude = extras.getDouble("longitude");
String lat = String.valueOf(latitude);
String lng = String.valueOf(longitude);
String URL = API_URL;
Uri.Builder builder = Uri.parse(URL).buildUpon();
builder.appendQueryParameter("lat", lat);
builder.appendQueryParameter("lng",lng);
URL =builder.build().toString();
Log.d(TAG, "buildURL: " + URL);
if (URLUtil.isValidUrl(URL)){
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, URL, null, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try{
for (int i = 0; i<response.length();i++){
JSONObject data = response.getJSONObject(i);
policeUkApi newModel = new policeUkApi();
newModel.setCategory(data.getString("category"));
JSONObject latlng= data.getJSONObject("location");
newModel.setLatitude(latlng.getDouble("latitude"));
newModel.setLongitude(latlng.getDouble("longitude"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mQueue.add(jsonArrayRequest);
}else {
Log.d(TAG, "ERROR GET API DATA URL NOT VALID");
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
markerOptions.title(newModel.getCategory());
markerOptions.snippet(newModel.getDate());
markerOptions.position(new LatLng(newModel.getLatitude(),newModel.getLongitude()));
Marker marker = mMap.addMarker(markerOptions);
}
}
公共类LoadPolicyData扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
ProgressDialog pDialog=新建ProgressDialog(MapsActivity.this);
pDialog.setMessage(“加载映射”);
pDialog.setCancelable(真);
pDialog.show();
}
@凌驾
受保护的Void doInBackground(URL…URL){
//TODO:不获取两次可能会导致错误
Bundle extras=getIntent().getExtras();
双纬度=额外获得双(“纬度”);
double longitude=extras.getDouble(“经度”);
String lat=String.valueOf(纬度);
字符串lng=字符串.valueOf(经度);
字符串URL=API_URL;
Uri.Builder=Uri.parse(URL.buildon();
建造商。附录查询参数(“lat”,lat);
建造商。附录参数(“lng”,lng);
URL=builder.build().toString();
Log.d(标记“buildURL:+URL”);
if(URLUtil.isvalidul(URL)){
JsonArrayRequest JsonArrayRequest=新的JsonArrayRequest(Request.Method.GET,URL,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONArray响应){
试一试{
对于(int i=0;i根据需要使用此修改的类
公共类LoadPolicyData扩展异步任务{
private policeUkApi newModel=new policeUkApi();
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
ProgressDialog pDialog=新建ProgressDialog(MapsActivity.this);
pDialog.setMessage(“加载映射”);
pDialog.setCancelable(真);
pDialog.show();
}
@凌驾
受保护的PolicyUKAPI doInBackground(URL…URL){
//TODO:不获取两次可能会导致错误
Bundle extras=getIntent().getExtras();
双纬度=额外获得双(“纬度”);
double longitude=extras.getDouble(“经度”);
String lat=String.valueOf(纬度);
字符串lng=字符串.valueOf(经度);
字符串URL=API_URL;
Uri.Builder=Uri.parse(URL.buildon();
建造商。附录查询参数(“lat”,lat);
建造商。附录参数(“lng”,lng);
URL=builder.build().toString();
Log.d(标记“buildURL:+URL”);
if(URLUtil.isvalidul(URL)){
JsonArrayRequest JsonArrayRequest=新的JsonArrayRequest(Request.Method.GET,URL,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONArray响应){
试一试{
对于(int i=0;i您在onResponse()
方法中定义了policyukapi newModel=new policyukapi();
并尝试在其他方法onPostExecute()
中获取数据。这是不可能的。不需要真正的后台线程(除非您正在解析的响应非常大)因为JsonArrayRequest
触发一个异步事务,当它准备好时,结果将出现在onResponse()
中。您将什么定义为“非常大”建议在不了解更多数据的情况下解析循环中的50多个条目,我会感到不舒服。重申:JsonArrayRequest
已经是异步的,结果显示在onResponse()
中。但是,您在onResponse()中提供的任何代码或循环
将在UI线程上处理。为什么将JsonArrayRequest()
放在异步任务中?JsonArrayRequest()
已经是异步的!@Barns,我甚至还没有看过doInBackground中的代码,这里的主要问题是asynctask是如何工作的,以及我们如何在UI线程中更新doInBackground中获得的数据。他是开发新手,我讨论了asynctasks是如何工作的,应用程序跳转到了很多人所以我假设这是什么导致了problem@NoobAndroid,如果您在UI线程中执行大量任务,是的,这将导致应用程序性能不佳。由于您使用的是截取,json数组请求本身在后台线程中运行,并在onResponse中显示结果。我只得到了一个map/a getlaglong函数where/and获取此数据