Как перейти к другому действию, когда соединение недоступно в Android? - PullRequest
0 голосов
/ 04 августа 2020

Я пытался добавить таймер к приложению, которое у меня есть, которое проверяет наличие inte rnet каждые 3 секунды, чтобы переключиться на второй xml файл при разрыве соединения, но выдает ошибку каждый раз. сообщение об ошибке:

E/AndroidRuntime: FATAL EXCEPTION: Timer-0
Process: com.example.friends, PID: 2221
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8530)
    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1432)
    at android.view.View.requestLayout(View.java:23224)
    at android.view.View.requestLayout(View.java:23224)
    at android.view.View.requestLayout(View.java:23224)
    at android.view.View.requestLayout(View.java:23224)
    at android.view.View.requestLayout(View.java:23224)
    at android.view.ViewGroup.removeAllViews(ViewGroup.java:5587)
    at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:554)
    at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
    at com.example.friends.MainActivity$2.run(MainActivity.java:51)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

это основное действие 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">

<TextView
    android:id="@+id/textView17"
    android:layout_width="404dp"
    android:layout_height="196dp"
    android:layout_marginStart="4dp"
    android:layout_marginTop="37dp"
    android:layout_marginEnd="4dp"
    android:layout_marginBottom="118dp"
    android:text="Hello world"
    android:textColor="#020202"
    android:textSize="24sp"
    app:layout_constraintBottom_toTopOf="@+id/textView18"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/textView18"
    android:layout_width="410dp"
    android:layout_height="71dp"
    android:layout_marginBottom="197dp"
    android:text="welcom to java"
    android:textColor="#000000"
    android:textSize="24sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView17" />
</androidx.constraintlayout.widget.ConstraintLayout>

Когда inte rnet недоступен, я хочу перейти к этому 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">

<TextView
    android:id="@+id/textView8"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginBottom="30dp"
    android:text="Looks like your connection is broken!"
    android:textSize="24sp"

</androidx.constraintlayout.widget.ConstraintLayout>

и это класс MainActivity:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Timer timer = new Timer() ;
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(!Internet_Class.isConnected(getApplicationContext())){
setContentView(R.layout.no_internet_connection) ;
}
else{
setContentView(R.layout.activity_main) ;
}
        }
    }, 0, 3000);
            }
}

и есть класс, который я назвал (Internet_Class), вот код:

public class Internet_Class {

public static boolean isConnected(Context context){
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo() ;
    return (info != null && info.isConnected()) ;
}
}

и манифесты:

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_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=".app_information"></activity>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Ошибка в том, что приложение перестает работать каждый раз через три секунды. Кто-нибудь знает, где ошибка или какое-либо предложение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...