Как получить данные с сервера в Android Studio с помощью JSON?
Надо получить с сервера одну переменную типа int. Вот такой код не работает, ошибку не выдает, просто вылетает эмулятор.
Код выглядит так:
private class DownloadDataTask extends AsyncTask < @Override protected String doInBackground(String. strings) < java.net.URL url = null; HttpURLConnection urlConnection = null; StringBuilder result = new StringBuilder(); try < url = new URL(strings[0]); urlConnection = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(inputStreamReader); String line = reader.readLine(); while (line != null) < result.append(line); line = reader.readLine(); >return result.toString(); > catch (MalformedURLException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >finally < if (urlConnection != null) < urlConnection.disconnect(); >> return null; > @Override protected void onPostExecute(String s) < super.onPostExecute(s); try < JSONObject jsonObject = new JSONObject(s); poluchennyedannye = jsonObject.getInt("data"); >catch (JSONException e) < e.printStackTrace(); Toast.makeText(MainActivity.this, "ВСЕ ПЛОХО. ВЫРУБАЙ ЭТОТ КОД, НИЧЕ НЕ РАБОТАЕТ. ", Toast.LENGTH_SHORT).show(); >> >
- Вопрос задан более года назад
- 166 просмотров
Как получить данные от сервера java android
На сегодняшний день если не все, то большинство Android-устройств имеют доступ к сети интернет. А большое количество мобильных приложений так или иначе взаимодействуют с средой интернет: загружают файлы, авторизуются и получают информацию с внешних веб-сервисов и т.д. Рассмотрим, как мы можем использовать в своем приложении доступ к сети интернет.
Среди стандартных элементов нам доступен виджет WebView, который может загружать контент с определенного url-адреса. Но этим возможности работы с сетью в Android не ограничиваются. Для получения данных с определенного интернет-ресурса мы можем использовать классы HttpUrlConnection (для протокола HTTP) и HttpsUrlConnection (для протокола HTTPS) из стандартной библиотеки Java.
Итак, создадим новый проект с пустой MainActivity. Первым делом для работы с сетью нам надо установить в файле манифеста AndroidManifest.xml соответствующее разрешение:
В файле activity_main.xml , который представляет разметку для MainActivity, определим следующий код:
Здесь определена кнопка для загрузки данных, а сами данные для примера загружаются одновременно в виде строки в текстовое поле и в элемент WebView. Так как данных может быть очень много, то текстовое поле помещено в элемент ScrollView.
Поскольку загрузка данных может занять некоторое время, то обращение к интернет-ресурсу определим в отдельном потоке и для этого изменим код MainActivity следующим образом:
package com.example.httpapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import javax.net.ssl.HttpsURLConnection; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView contentView = findViewById(R.id.content); WebView webView = findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); Button btnFetch = findViewById(R.id.downloadBtn); btnFetch.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < contentView.setText("Загрузка. "); new Thread(new Runnable() < public void run() < try< String content = getContent("https://stackoverflow.com/"); webView.post(new Runnable() < public void run() < webView.loadDataWithBaseURL("https://stackoverflow.com/",content, "text/html", "UTF-8", "https://stackoverflow.com/"); Toast.makeText(getApplicationContext(), "Данные загружены", Toast.LENGTH_SHORT).show(); >>); contentView.post(new Runnable() < public void run() < contentView.setText(content); >>); > catch (IOException ex) < contentView.post(new Runnable() < public void run() < contentView.setText("Ошибка: " + ex.getMessage()); Toast.makeText(getApplicationContext(), "Ошибка", Toast.LENGTH_SHORT).show(); >>); > > >).start(); > >); > private String getContent(String path) throws IOException < BufferedReader reader=null; InputStream stream = null; HttpsURLConnection connection = null; try < URL url=new URL(path); connection =(HttpsURLConnection)url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(10000); connection.connect(); stream = connection.getInputStream(); reader= new BufferedReader(new InputStreamReader(stream)); StringBuilder buf=new StringBuilder(); String line; while ((line=reader.readLine()) != null) < buf.append(line).append("\n"); >return(buf.toString()); > finally < if (reader != null) < reader.close(); >if (stream != null) < stream.close(); >if (connection != null) < connection.disconnect(); >> > >
Непосредственно для самой загрузки определен метод getContent() , который будет загружать веб-страницу с помощью класса HttpsURLConnection и возвращать код загруженной страницы в виде строки.
Вначале создается элемент HttpsURLConnection :
URL url=new URL(path); connection =(HttpsURLConnection)url.openConnection(); connection.setRequestMethod("GET"); // установка метода получения данных -GET connection.setReadTimeout(10000); // установка таймаута перед выполнением - 10 000 миллисекунд connection.connect(); // подключаемся к ресурсу
После подключение происходит считывание со входного потока:
stream = connection.getInputStream(); reader= new BufferedReader(new InputStreamReader(stream));
Используя входной поток, мы можем считать его в строку.
Этот метод getContent() затем будет вызываться в обработчике нажатия кнопки:
Button btnFetch = (Button)findViewById(R.id.downloadBtn); btnFetch.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < contentView.setText("Загрузка. "); new Thread(new Runnable() < public void run() < try< String content = getContent("https://stackoverflow.com/");
Поскольку загрузка может занять долгое время, то метод getContent() в отдельном потоке с помощью объектов Thread и Runnable. Для примера в данном случае обращение идет к ресурсу "https://stackoverflow.com/".
Запустим приложение и нажмем на кнопку. И при наличии интернета приложение загрузит гравную страницу с "https://stackoverflow.com/" и отобразит ее в WebView и TextView:

Конечно, данный способ вряд ли подходит для просмотра интернет-страниц, однако таким образом, мы можем получать какие-либо данные (не интернет-страницы) от различных веб-сервисов, например, в формате xml или json (например, различные курсы валют, показатели погоды), используя специальные api, и затем после обработки показывать их пользователю.
Как получить JSON данные с сервера в Android?
Надо получить одну переменную int с сервера. Не получается, эмулятор вылетает, никакую ошибку не выдаёт. Код вот такой:
private class DownloadDataTask extends AsyncTask < @Override protected String doInBackground(String. strings) < java.net.URL url =` null; HttpURLConnection urlConnection = null; StringBuilder result = new StringBuilder(); try < url = new URL(strings[0]); urlConnection = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(inputStreamReader); String line = reader.readLine(); while (line != null) < result.append(line); line = reader.readLine(); >return result.toString(); > catch (MalformedURLException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >finally < if (urlConnection != null) < urlConnection.disconnect(); >> return null; > @Override protected void onPostExecute(String s) < super.onPostExecute(s); try < JSONObject jsonObject = new JSONObject(s); poluchennyedannye = jsonObject.getInt("data"); >catch (JSONException e) < e.printStackTrace(); Toast.makeText(MainActivity.this, "ВСЕ ПЛОХО. ВЫРУБАЙ ЭТОТ КОД, НИЧЕ НЕ РАБОТАЕТ. ", Toast.LENGTH_SHORT).show(); >> >
Отслеживать
11.7k 3 3 золотых знака 25 25 серебряных знаков 33 33 бронзовых знака
задан 25 ноя 2022 в 12:54
AndroidStudioUser AndroidStudioUser
3 1 1 бронзовый знак
Код выглядит что написан лет 10 назад. Может пришло время переписать? Есть куча библиотек в помощь.
25 ноя 2022 в 13:45
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
- Для начала в папке res/xml нужно создать файл: network_security_config.xml со следующим содержимым:
package com.example.android; import androidx.appcompat.app.AppCompatActivity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyTask myTask = new MyTask(); myTask.execute(); >private class MyTask extends AsyncTask < StringBuilder builder = new StringBuilder(); String line; @Override protected void onPreExecute() < super.onPreExecute(); Toast.makeText(MainActivity.this, "Подключение к API", Toast.LENGTH_SHORT).show(); >@Override protected Void doInBackground(Void. voids) < try < URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setDoInput(true); httpURLConnection.connect(); if(httpURLConnection.getResponseCode() != HttpURLConnection.HTTP_OK) < throw new Exception(httpURLConnection.getResponseMessage()) >BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream())); while((line = bufferedReader.readLine()) != null) < builder.append(line); >bufferedReader.close(); httpURLConnection.disconnect(); > catch (Exception e) < Log.e("ERROR", e.getMessage()); >return null; > @Override protected void onPostExecute(Void unused) < super.onPostExecute(unused); try < JSONObject buffer = new JSONObject(builder.toString()); Log.d("Тайтл", buffer.getString("title")); >catch (JSONException e) < e.printStackTrace(); >> > >
Получение данных с сервера Android без нажатий на кнопку, как организовать?
Всем привет. Подскажите пожалуйста, как ( и какой либрой) организовать получение данных с сервера без нажатий на кнопку в андроид приложении. На данный момент есть приложение которое получает данные с сервера по нажатию на кнопку. Хотелось бы от этого избавиться и получать данные например раз в n секунд. Использую OkHttp.
вот пример моего говнокода)
public class MainActivity extends AppCompatActivity < Button button; TextView getTemperature; private OkHttpClient client; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.submitButton); getTemperature = findViewById(R.id.getTemperature); button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < getWeb(); >>); client = new OkHttpClient(); > private void getWeb() < Request request = new Request.Builder().url("http://192.168.0.23:3000").build(); client.newCall(request).enqueue(new Callback() < @Override public void onFailure(Call call, IOException e) < runOnUiThread(new Runnable() < @Override public void run() < getTemperature.setText("в работе возникла ошибка, скорее всего отсутствует интернет"); >>); > @Override public void onResponse(Call call, final Response response) < runOnUiThread(new Runnable() < @Override public void run() < try< getTemperature.setText(response.body().string()); >catch (IOException ioe) < getTemperature.setText("r"); >> >); > >); > >
- Вопрос задан более трёх лет назад
- 966 просмотров
Комментировать
Решения вопроса 1

Разработчик Android
Создать фоновый таймер для загрузки данных:
AsyncLoaderTimer bgTimer = new AsyncLoaderTimer(); //новое поле класса MainActivity class AsyncLoaderTimer extends AsyncTask /класс фонового таймера @Override protected Void doInBackground(Long. longs) < while (isCancelled()) < try < Thread.sleep(longs[0]); > catch (InterruptedException e) < e.printStackTrace(); >publishProgress(); > return null; > @Override protected void onProgressUpdate(Void. values) < getWeb(); >> @Override protected void onStart() < super.onStart(); bgTimer.execute(2_000L); //интервал миллисекунд >@Override protected void onStop()
То как Вы хотите реализовать обновление данных - не лучшая практика. Вам лучше посмотреть как реализовывать такие клиент-серверные решения.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать