Почему нет доступа к переменной метода public static void
Не могу присвоить переменной myset значение из public static void loadIntoListView(String json) throws JSONException
Ошибка: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
public class RemoteClass {
public static String mysett;
public static String getSettings(String urlSettings) {
downloadJSON(urlSettings);
return mysett;
}
public static 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 "";
}
}
}
DownloadJSON getJSON = new DownloadJSON();
getJSON.execute();
}
public static void loadIntoListView(String json) throws JSONException {
mysett="0";
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
mysett = obj.getString("button_protected");
}
}
}
Ответы (1 шт):
Zafar, судя потому что вы пишете вы не соблюдаете синхроность.
В первый момент выполняли асинхронный запрос, и не дожидаясь его выполнения тут же запрашивали значение переменной. А так как она не была иннициализированна, то приложение падало с NPE. Сейчас вы переменную инициализировали, но проблема осталась. Если хотите использовать данный код, то вам нужно запускать следующую активность в методе onPostExecute.
Ну и если честно, то текущий код плох.
Во-первых не используйте AsyncTask, даже сам google просит это делать уже несколько лет, в этом году его официально прекратили его пометили как деприкейт. Для асинхроных запросов разберите корутины или rx. Если вы собираетесь и далее заниматься андроидом, поверьте это того стоит.
Во-вторых если вы просто пытаетесь получить json по url то почитайте про retrofit. Там достаточно просто и много готовых инструментов которые возьмут на себя и асинхронность и парсиг json