Как получить данные от сервера java android
Перейти к содержимому

Как получить данные от сервера java android

  • автор:

Как получить данные с сервера в 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:

HttpsURLConnection и загрузка данных из интернета в Android и Java

Конечно, данный способ вряд ли подходит для просмотра интернет-страниц, однако таким образом, мы можем получать какие-либо данные (не интернет-страницы) от различных веб-сервисов, например, в формате 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

Сортировка: Сброс на вариант по умолчанию

  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

RATlius

Разработчик Android

Создать фоновый таймер для загрузки данных:

AsyncLoaderTimer bgTimer = new AsyncLoaderTimer(); //новое поле класса MainActivity class AsyncLoaderTimer extends AsyncTask  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 Комментировать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *