java - 我在 Android JSON 解析从 URL 检索时遇到错误

标签 java android json

我是 Android 新手...我正在尝试 Android JSON 解析从 URL 检索并将 MySQL DB 数据设置到 TextView 中,但出现错误。我尝试了很多解决方案,但它不起作用帮助我解决这个错误

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.getString(java.lang.String)' on a null object reference at

com.example.testapplication.MainActivity$GetDataFromServerIntoTextView.onPostExecute(MainActivity.java:123)at com.example.testapplication.MainActivity$GetDataFromServerIntoTextView.onPostExecute(MainActivity.java:63)

错误显示此行 textView.setText(jsonObject.getString("distance"));

我的代码

 HttpResponse httpResponse;
    Button button;
    TextView textView;
    static JSONObject jsonObject = null ;
    String StringHolder = "" ;
    ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button)findViewById(R.id.button);
        textView = (TextView)findViewById(R.id.textView);
        progressBar = (ProgressBar)findViewById(R.id.progressBar);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                progressBar.setVisibility(View.VISIBLE);
                new GetDataFromServerIntoTextView(MainActivity.this).execute();

            }
        });
    }

    public class GetDataFromServerIntoTextView extends AsyncTask<Void, Void, Void>
    {
        public Context context;
        public GetDataFromServerIntoTextView(Context context)
        {
            this.context = context;
        }

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0)
        {

            HttpClient httpClient = new DefaultHttpClient();
            String HttpURL = "https://api.myjson.com/bins/1cuzhn";
            // Adding HttpURL to my HttpPost oject.
            HttpPost httpPost = new HttpPost(HttpURL);

            try {
                httpResponse = httpClient.execute(httpPost);

                StringHolder = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try{
                JSONArray jsonArray = new JSONArray(StringHolder);
                jsonObject = jsonArray.getJSONObject(0);



            } catch ( JSONException e) {
                e.printStackTrace();
            }

            catch (Exception e)
            {
                e.printStackTrace();
            }
            return null;
        }
        protected void onPostExecute(Void result)
        {
            try {

               textView.setText(jsonObject.getString("distance"));

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            progressBar.setVisibility(View.GONE);

        }
    }

最佳答案

我修改了您的 AsyncTask 并测试了下面的代码及其工作正常。如果您发现任何问题,请告诉我。

添加以下依赖项 //OKHTTP

implementation 'com.squareup.okhttp:okhttp:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
implementation 'org.apache.httpcomponents:httpcore:4.4.10'

public class GetDataFromServerIntoTextView extends AsyncTask<Void, Void,String> 
          {
        public Context context;

        public GetDataFromServerIntoTextView(Context context) {
            this.context = context;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Void... voids) {

            String strUrl = "https://api.myjson.com/bins/1cuzhn";
            String data = "";
            InputStream iStream = null;
            HttpURLConnection urlConnection = null;
            try {
                URL url = new URL(strUrl);

                // Creating an http connection to communicate with url
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.connect();

                // Reading data from url
                iStream = urlConnection.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
                StringBuffer sb = new StringBuffer();

                String line = "";
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }

                data = sb.toString();

                br.close();

            } catch (Exception e) {
                Log.d(TAG, "Exception while downloading url " + e.toString());
            } finally {
                try {
                    iStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                urlConnection.disconnect();
            }
            return data;
        }


        @Override
        protected void onPostExecute(String data) {
            super.onPostExecute(data);
            try {
                if (data != null) {
                    JSONArray jsonArray = new JSONArray(data);

                    for (int i = 0; i < jsonArray.length(); i++) {

                        JSONObject jsonObject = jsonArray.getJSONObject(i);

                        // Here is your all data of distance and time
                        Log.e(TAG, "distance " + jsonObject.get("distance"));
                        Log.e(TAG, "time " + jsonObject.get("time"));

                    }

                } else {
                    Log.e(TAG, "onPostExecute: null json object");
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    } 

关于java - 我在 Android JSON 解析从 URL 检索时遇到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57567083/

相关文章:

java - 通过将 InMemory 更改为 Spring Data JPA/Mysql 分离实体

安卓。写入失败 : EPIPE (Broken pipe) when use Process

java - JSON 到 GSON 对象

java - 元胞数组方法返回

Java将父对象转换为子对象?

java - 如何在JNI层修改java类对象

android - 如何在不改变NaviBar android的情况下透明状态栏

java - 无法读取 JSON : Unexpected end-of-input in field name

javascript - JSON 字符串中的对象名称中有空格并且仍然可以检索它吗?

java - 将 JPanel 用作 JTable 单元格编辑器时出现焦点问题