Почему я получаю нулевую ссылку на объект в Android 9 пирог - PullRequest
0 голосов
/ 19 июня 2019

Я получаю эту ошибку, когда тестирую свое приложение на Android 9 Pie 28 API версии.Работает в версии 8 oreo.Как будто не получил данные в JSONobject, что может вызвать проблему?

Попытка вызвать виртуальный метод 'int java.lang.String.length ()' для ссылки на пустой объект

private void downloadJSON(final String urlWebService) {

        class DownloadJSON extends AsyncTask<Void, Void, String> {

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


            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
//                Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
                try {
                    loadIntoListView(s);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            protected String doInBackground(Void... voids) {
                try {
                    URL url = new URL(urlWebService);
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
                    StringBuilder sb = new StringBuilder();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    String json;
                    while ((json = bufferedReader.readLine()) != null) {
                        sb.append(json + "\n");
                    }
                    return sb.toString().trim();
                } catch (Exception e) {
                    return null;
                }
            }
        }
        DownloadJSON getJSON = new DownloadJSON();
        getJSON.execute();
    }

    private void loadIntoListView(String json) throws JSONException {
        JSONArray jsonArray = new JSONArray(json);
        String[] stocks = new String[jsonArray.length()];
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject obj = jsonArray.getJSONObject(i);
            stocks[i] = obj.getString("sent_date") + "| " + obj.getString("username") + ": " + obj.getString("message");
        }
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, stocks);
        listView.setAdapter(arrayAdapter);
    }

1 Ответ

0 голосов
/ 19 июня 2019

Это потому, что сервер, к которому вы пытаетесь получить доступ, небезопасен, т.е. использует HTTP (не HTTPS).

Android P по умолчанию использует HTTPS.Это означает, что если вы используете в своем приложении незашифрованные HTTP-запросы, приложение будет работать нормально во всех версиях Android, кроме Android P.

Чтобы избежать этой безопасности, попробуйте внести изменения в код приложения ниже.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

и в res / xml добавьте файл с именем: network_security_config.xml

в network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        //  Add host of your download URL in below line. 
        //   ie. if url is  "https://www.google.com/search?source=...."
        //   then just add "www.google.com"
        <domain includeSubdomains="true">www.google.com</domain>
    </domain-config>
</network-security-config>
...