Руководство Android Networking
View more Tutorials:
В Android сетевое программирование включает запросы на сервер и извлечение возвращенных данных. В принципе у вас есть 2 API чтобы работать с сетью:
Apache HttpClient:
- Это библиотека с открытым исходным кодом предоставленный в Apache.
HttpURLConnection
- Это официальный API Android, он был включен с версии Android 2.3, до этого Android использовал Apache HttpClient чтобы работать с сетью.

Для работы с сетью, требуется некоторые разрешения приложению:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
android.permission.INTERNET:
- Добавьте это permission (разрешение), позвольте вашему приложению иметь возможность соединения сети.
android.permission.ACCESS_NETWORK_STATE:
- Разрешите вашему приложению проверять статус соединения сети телефона.
Следующий код проверяет соединен ли к сети телефон пользователя или нет, метод возвращает true если есть соединение, и false в обратном случае.
private boolean checkInternetConnection() { ConnectivityManager connManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connManager.getActiveNetworkInfo(); if (networkInfo == null) { Toast.makeText(this, "No default network is currently active", Toast.LENGTH_LONG).show(); return false; } if (!networkInfo.isConnected()) { Toast.makeText(this, "Network is not connected", Toast.LENGTH_LONG).show(); return false; } if (!networkInfo.isAvailable()) { Toast.makeText(this, "Network not available", Toast.LENGTH_LONG).show(); return false; } Toast.makeText(this, "Network OK", Toast.LENGTH_LONG).show(); return true; }
По умолчанию, когда вы работаете с сетью (network) в Android, вам нужно создать новый thread чтобы отправлять и получать данные. Если вы работаете на главном thread вы получите ошибку android.os.NetworkOnMainThreadException, это регулирование по умолчанию у Android. Но вы можете заместить это регулирование, чтобы работать с сетью на главном thread.
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

Рекомендуем вам создать класс расширенный из AsyncTask<Params, Progress, Result>, этот класс не является Thread-ом, он расширен из Object, но при выполнении задания (Вызов методом AsyncTask.execute(params)), он создает новый Thread чтобы сделать вызов методом doInBackground(params). После того, как thread завершает вызывается метод onPostExecute(result).
Посмотрите следующую иллюстрацию:

В этом примере, вы скачиваете фото и Json из URL и показываете на ImageView и TextView.

Создать project AndroidNetworkingDemo:
- File > New > New Project > Empty Activity
- Name: AndroidNetworkingDemo
- Package name: org.o7planning.androidnetworkingdemo
- Language: Java

Вам нужно дать разрешение приложению иметь доступ к интернету и проверять статус сети.
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Добавить код в AndroidManifest.xml:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.o7planning.androidnetworkingdemo"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Интерфейс приложения:

Если вас интересуют шаги дизайна интерфейса данного приложения, смотрите приложение в конце статьи.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/imageView" android:layout_width="0dp" android:layout_height="171dp" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="18dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:contentDescription="Image" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/ic_launcher_foreground" /> <TextView android:id="@+id/textView" android:layout_width="0dp" android:layout_height="186dp" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="19dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:orientation="horizontal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView"> <Button android:id="@+id/button_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:text="Download Image" /> <Button android:id="@+id/button_json" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:text="Download JSON" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
Code:
IOUtils.java
package org.o7planning.androidnetworkingdemo; import java.io.InputStream; import java.io.Reader; public class IOUtils { public static void closeQuietly(InputStream in) { try { in.close(); }catch (Exception e) { } } public static void closeQuietly(Reader reader) { try { reader.close(); }catch (Exception e) { } } }
DownloadJsonTask.java
package org.o7planning.androidnetworkingdemo; import android.os.AsyncTask; import android.util.Log; import android.widget.TextView; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; // A task with String input parameter, and returns the result as String. public class DownloadJsonTask // AsyncTask<Params, Progress, Result> extends AsyncTask<String, Void, String> { private TextView textView; public DownloadJsonTask(TextView textView) { this.textView= textView; } @Override protected String doInBackground(String... params) { String textUrl = params[0]; InputStream in = null; BufferedReader br= null; try { URL url = new URL(textUrl); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); httpConn.setAllowUserInteraction(false); httpConn.setInstanceFollowRedirects(true); httpConn.setRequestMethod("GET"); httpConn.connect(); int resCode = httpConn.getResponseCode(); if (resCode == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); br= new BufferedReader(new InputStreamReader(in)); StringBuilder sb= new StringBuilder(); String s= null; while((s= br.readLine())!= null) { sb.append(s); sb.append("\n"); } return sb.toString(); } else { return null; } } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(br); } return null; } // When the task is completed, this method will be called // Download complete. Lets update UI @Override protected void onPostExecute(String result) { if(result != null){ this.textView.setText(result); } else{ Log.e("MyMessage", "Failed to fetch data!"); } } }
DownloadImageTask.java
package org.o7planning.androidnetworkingdemo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; import android.widget.ImageView; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; // A task with String input parameter, and returns the result as bitmap. public class DownloadImageTask // AsyncTask<Params, Progress, Result> extends AsyncTask<String, Void, Bitmap> { private ImageView imageView; public DownloadImageTask(ImageView imageView) { this.imageView= imageView; } @Override protected Bitmap doInBackground(String... params) { String imageUrl = params[0]; InputStream in = null; try { URL url = new URL(imageUrl); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); httpConn.setAllowUserInteraction(false); httpConn.setInstanceFollowRedirects(true); httpConn.setRequestMethod("GET"); httpConn.connect(); int resCode = httpConn.getResponseCode(); if (resCode == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); } else { return null; } Bitmap bitmap = BitmapFactory.decodeStream(in); return bitmap; } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(in); } return null; } // When the task is completed, this method will be called // Download complete. Lets update UI @Override protected void onPostExecute(Bitmap result) { if(result != null){ this.imageView.setImageBitmap(result); } else{ Log.e("MyMessage", "Failed to fetch data!"); } } }
MainActivity.java
package org.o7planning.androidnetworkingdemo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private ImageView imageView; private TextView textView; private Button buttonImg; private Button buttonJson; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.imageView = (ImageView) this.findViewById(R.id.imageView); this.textView = (TextView) this.findViewById(R.id.textView); this.buttonImg = (Button) this.findViewById(R.id.button_img); this.buttonJson = (Button) this.findViewById(R.id.button_json); this.buttonImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { downloadAndShowImage(v); } }); this.buttonJson.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { downloadAndShowJson(v); } }); } private boolean checkInternetConnection() { // Get Connectivity Manager ConnectivityManager connManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); // Details about the currently active default data network NetworkInfo networkInfo = connManager.getActiveNetworkInfo(); if (networkInfo == null) { Toast.makeText(this, "No default network is currently active", Toast.LENGTH_LONG).show(); return false; } if (!networkInfo.isConnected()) { Toast.makeText(this, "Network is not connected", Toast.LENGTH_LONG).show(); return false; } if (!networkInfo.isAvailable()) { Toast.makeText(this, "Network not available", Toast.LENGTH_LONG).show(); return false; } Toast.makeText(this, "Network OK", Toast.LENGTH_LONG).show(); return true; } // When user click on the "Download Image". public void downloadAndShowImage(View view) { boolean networkOK = this.checkInternetConnection(); if (!networkOK) { return; } String imageUrl = "https://o7planning.org/download/static/default/demo-data/logo.png"; // Create a task to download and display image. DownloadImageTask task = new DownloadImageTask(this.imageView); // Execute task (Pass imageUrl). task.execute(imageUrl); } // When user click on the "Download Json". public void downloadAndShowJson(View view) { boolean networkOK = this.checkInternetConnection(); if (!networkOK) { return; } String jsonUrl = "https://o7planning.org/download/static/default/demo-data/company.json"; // Create a task to download and display json content. DownloadJsonTask task = new DownloadJsonTask(this.textView); // Execute task (Pass jsonUrl). task.execute(jsonUrl); } }
Добавить ImageView, TextView в интерфейс.


Добавть Button в интерфейс.


Настроить ID, Text для компонентов на интерфейсе.
