這次研究的過程中發現了這個 Rx.Network 依賴庫,可以幫助我們監聽 Android 的網路狀態,這次我要使用它的 Boolean 回傳工程讓我的 APP 可以得知現在是否有開啟網路,這個不管是 Wi-Fi 或行動數據都是適用的!介面簡單做個 TextView 用來顯示「有網路」與「無網路」,搭配 Toast 提示顯示「網路連線」與「網路中斷」,這次用 Java 來撰寫判斷程式,讓我們開始實作吧!這次我們用 Android Studio 新增一個 Empty Activity 來改。
📁 res → 📁 layout → 📄 activity_main.xml
▲ 設計模式看大致上長這樣,預設先讓它顯示載入中,到時候 Java 程式會給它顯示「無網路」或「有網路」。
▲ 切換成原始碼模式,我們就直接用現有的 TextView 稍作修改,加上 ID 之後寫 Java 會用到,完整原始碼如下:
<?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">
<TextView
android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Loading..."
android:textSize="60sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
📄 build.gradle (Project)
▲ 記得在箭頭位置加上以下原始碼:
maven { url "https://jitpack.io" }
📄 build.gradle (Module)
▲ 添加依賴項,在箭頭位置加上以下原始碼:
implementation 'io.andref:Rx.Network:1.0.1'
📁 manifests → 📄 AndroidManifest.xml
▲ 添加權限,在箭頭位置加上以下原始碼:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
📁 java → 📄 MainActivity.java
▲ 完整判斷 Java 程式,基本上寫在 onCreate 區塊內,使用的是它提供的 Boolean 回傳來偵測網路的開啟或關閉,完整程式碼如下:
package tw.mnya.rxnetwork;
import androidx.appcompat.app.AppCompatActivity;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import io.andref.rx.network.RxNetwork;
import rx.functions.Action1;
public class MainActivity extends AppCompatActivity {
private TextView info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
info = findViewById(R.id.info);
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
RxNetwork.connectivityChanges(this, connectivityManager)
.subscribe(new Action1<Boolean>()
{
@Override
public void call(Boolean connected)
{
if (connected) {
info.setText("有網路");
Toast.makeText(getApplicationContext(), "網路連線", Toast.LENGTH_SHORT).show();
} else {
info.setText("無網路");
Toast.makeText(getApplicationContext(), "網路中斷", Toast.LENGTH_SHORT).show();
}
}
});
}
}
▲ 實際運作效果截圖,我是在開始或關閉網路後馬上截圖的,因此下方 Toast 提示還在。
⌨️ GitHub 存放庫:https://github.com/qwe987299/Rx.Network
留言區 / Comments
萌芽論壇