2016-09-06 9 views
1

Я пытаюсь разобрать некоторые значения из моей базы данных в Android Studio, используя разбор JSON. Я хочу использовать AsyncTask и запускать его на BackgroundThread, поскольку, похоже, для работы на mainthread очень много.Использование AsyncTask с запросом JSON из базы данных

Я использую данные из своей базы данных в mapactivity, используя карты google для размещения маркеров (может быть релевантно).

Проблема заключается в том, что даже если я пытаюсь использовать AsyncTask (я еще новичок в Android), он все еще говорит мне об этом в консоли:

I/Choreographer: Skipped 33 frames! The application may be doing too much work on its main thread. 

Вот мой код для моего AsyncTask:

public class GetMarkers extends AsyncTask<String, Void, String> { 

    private ProgressDialog pDialog; 

    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(AllMarkersActivity.this); 
     pDialog.setMessage("Loading markers..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    protected String doInBackground(String... params) { 

     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 

       Response.Listener<String> responseListener = new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         try { 

          JSONObject jsonObject = new JSONObject(response); 
          Iterator<String> keys = jsonObject.keys(); 
          while(keys.hasNext()) 
          { 
           String key = keys.next(); 
           if(!key.equals("success")){ // or use this if your keys are always in digits form.. if(TextUtils.isDigitsOnly(key)) 
            Log.v("category key", key); 

            JSONObject innerJObject = jsonObject.getJSONObject(key); 

            String lat_str = innerJObject.getString("lat"); 
            double lat = 0.0, lng = 0.0; 

            if(!TextUtils.isEmpty(lat_str) &&  TextUtils.isDigitsOnly(lat_str)) 
             lat = Double.parseDouble(lat_str); 

            String lng_str = innerJObject.getString("lng"); 

            if(!TextUtils.isEmpty(lng_str) && TextUtils.isDigitsOnly(lng_str)) 
             lng = Double.parseDouble(lng_str); 

            LatLng Mplace = new LatLng(lat, lng); 

            MarkerOptions marker = new MarkerOptions().position(Mplace).title("Marker").snippet("Snippet:" + "0"); 
            mMap.addMarker(marker); 

           } 
          } 





        } catch (JSONException e) { 
         e.printStackTrace(); 
         Log.i("RESPONSE:", "[" + response + "]"); 
         Toast.makeText(getApplicationContext(), 
           "Error: " + e.getMessage(), 
           Toast.LENGTH_LONG).show(); 
        } 

        } 

       }; 

       MarkerRequest markerRequest = new MarkerRequest(responseListener); 
       RequestQueue queue = Volley.newRequestQueue(AllMarkersActivity.this); 
       queue.add(markerRequest); 

      } 
     }); 


     return null; 
    } 

    protected void onPostExecute(String file_url) { 
     // dismiss the dialog once got all details 
     pDialog.dismiss(); 
    } 


} 

Когда я то хочу выполнить Я просто использовать:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

    new GetMarkers().execute(); 

Однако по какой-то причине, диалог прогресса никогда не появляется, когда я открываю свою активность в отношении карт, и это дает мне 33 пропущенных кадра «ошибка».

Любая помощь очень ценится!

Пожалуйста, ответьте на пример, все еще изучая! :)

Спасибо!

ответ

3

избавиться от runOnUiThread(new Runnable() {

Точка doInBackground здесь, так что не работает на UI-потоке.

Ваш материал UI должен иметь место в onPostExecute

и технически, так как вы используете Response.Listener<String> responseListener, вам не нужно запускать это в AsyncTask

public void onResponse ведет себя как onPostExecute