2015-06-07 3 views
0

Я пытаюсь адаптировать два учебника, чтобы узнать Volley.Android: ошибка диалогового окна прогресса java.lang.NullPointerException

У меня ошибка с отображением диалогового окна прогресса.

Это мой код:

public class MainActivity extends Activity { 

    final static String MARS_WEATHER_RECENT = "http://marsweather.ingenology.com/v1/latest/"; 
    private static String TAG = MainActivity.class.getSimpleName(); 

    // Progress dialog 
    private ProgressDialog pDialog; 

    private TextView debug_container; 
    private TextView degrees; 

    // temporary string to show the parsed response 
    private String jsonResponse; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     debug_container = (TextView) findViewById(R.id.debug_container); 
     degrees = (TextView) findViewById(R.id.degrees); 

     loadMarsWeatherData(); 

     pDialog = new ProgressDialog(this); 
     pDialog.setMessage("Please wait..."); 
     pDialog.setCancelable(false); 

    } 

    private void loadMarsWeatherData() { 

     showpDialog(); 
     JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, 
       MARS_WEATHER_RECENT, (String)null, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       Log.d(TAG, response.toString()); 

       try { 
        // Parsing json object response 
        // response will be a json object 
        response = response.getJSONObject("report"); 
        String min_degree = response.getString("min_temp"); 

        degrees.setText(min_degree); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), 
          "Error: " + e.getMessage(), 
          Toast.LENGTH_LONG).show(); 
       } 
       hidepDialog(); 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       Toast.makeText(getApplicationContext(), 
         error.getMessage(), Toast.LENGTH_SHORT).show(); 
       // hide the progress dialog 
       hidepDialog(); 
      } 
     }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(jsonObjReq); 
    } 





    private void showpDialog() { 
     if (!pDialog.isShowing()) 
      pDialog.show(); 
    } 

    private void hidepDialog() { 
     if (pDialog.isShowing()) 
      pDialog.dismiss(); 
    } 
} 

Ошибка

[...] 
    FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.webtemplum.crazyweather/com.webtemplum.crazyweather.MainActivity}: java.lang.NullPointerException 
[...] 
used by: java.lang.NullPointerException 
      at com.webtemplum.crazyweather.MainActivity.showpDialog(MainActivity.java:222) 
      at com.webtemplum.crazyweather.MainActivity.loadMarsWeatherData(MainActivity.java:56) 
      at com.webtemplum.crazyweather.MainActivity.onCreate(MainActivity.java:46) 

(Stripped некоторой строки ошибки, если я правильно понял право ошибки в showpDialog).

Конечно, если я прокомментирую showpDialog приложение запускается.

То же самое (работает приложение), если я комментирую все блок в loadWeatherData и оставить только

private void loadMarsWeatherData() { 

     showpDialog(); 
     hidepDialog(); 
} 

Большое спасибо.

+0

Что-то есть 'null' в' MainActivity.java', строка 222. – Jesper

ответ

3

Посмотрите на этот сегмент кода:

loadMarsWeatherData(); 

pDialog = new ProgressDialog(this); 
pDialog.setMessage("Please wait..."); 
pDialog.setCancelable(false); 

Вы звоните loadMarsWeatherData перед тем инстанцировании pDialog. Тем не менее, в loadMarsWeatherData вы звоните pDialog:

showpDialog(); 

позвонит:

private void showpDialog() { 
    if (!pDialog.isShowing()) 
     pDialog.show(); 
} 

Вы должны изменить порядок - первый экземпляр pDialog, а затем вызвать метод:

pDialog = new ProgressDialog(this); 
pDialog.setMessage("Please wait..."); 
pDialog.setCancelable(false); 

loadMarsWeatherData(); 
1

Вы вызываете loadMarsWeatherData() перед объявлением диалогового окна прогресса, который возвращает нуль. Просто поставьте loadMarsWeatherData() после объявления диалогового окна «Прогресс».

pDialog = new ProgressDialog(this); 
pDialog.setMessage("Please wait..."); 
pDialog.setCancelable(false); 

loadMarsWeatherData(); 

И все готово!