Android:进度对话框错误java.lang.NullPointerException

时间:2015-06-07 06:42:50

标签: java android

我正在尝试修改两个教程,以学习Volley。

显示进度对话框时出错。

这是我的代码:

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)

(删除了一些错误行,如果我理解错误是在showpDialog中)。

当然,如果我评论showpDialog应用运行。

同样的事情(app运行)如果我评论loadWeatherData中的所有块并且只留下

private void loadMarsWeatherData() {

        showpDialog();
        hidepDialog();
}

非常感谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

在声明返回null的进度对话框之前,您正在调用loadMarsWeatherData()。在声明进度对话框后,只需输入loadMarsWeatherData()

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

 loadMarsWeatherData();

你们都完成了!