Android 从doInBackground获取数据时遇到问题

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.

我的代码工作有问题,因为UI线程做了很多工作。我必须执行一个异步任务来获取JSON数据

我的问题是,我无法从包含所有getter和setter的类中获取数据。我是Android开发新手

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获取此数据