Как проверить подключение к сети, как YouTube? - PullRequest
0 голосов
/ 30 сентября 2019

Я работаю над возможностью проверки интернет-соединения, например, что YouTube сейчас делает в приложении для Android.

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

Вот мой код MainActivity:

public class LoginActivity extends AppCompatActivity implements NetworkReceiver.ConnectionChangeCallback{

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        IntentFilter intentFilter02 = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        networkReceiver = new NetworkReceiver();
        registerReceiver(networkReceiver, intentFilter02);
        networkReceiver.setConnectionChangeCallback(this);
        }

    @Override
    public void onConnectionChange(boolean isConnected) {

        if (isConnected){
            // will be called when internet is gone.
            tv_check_connection.setText("Back Online");
            connection.setBackgroundColor(Color.parseColor("#00BE84"));
            connection.startAnimation(slideDownToUp);
            tv_check_connection.setTextColor(Color.WHITE);

            Handler handler = new Handler();
            Runnable delayrunnable = new Runnable() {
                @Override
                public void run() {
                    tv_check_connection.setVisibility(View.GONE);
                }
            };
            handler.postDelayed(delayrunnable, 4000);

        }else{
            // will be called when internet is back
            new MyDialog().show(getSupportFragmentManager(), "my_dialog");
            tv_check_connection.setText("No connection");
            tv_check_connection.setVisibility(View.VISIBLE);
            connection.startAnimation(slideDownToUp);
            connection.setBackgroundColor(Color.parseColor("#2D2D2D"));
            tv_check_connection.setTextColor(Color.WHITE);
        }

    }
}

ИВот мой класс NetworkReceiver:

public class NetworkReceiver extends BroadcastReceiver {

    public static final String NETWORK_AVAILABLE_ACTION = "com.example.ritecare.NetworkAvailable";
    public static final String IS_NETWORK_AVAILABLE = "isNetworkAvailable";

    ConnectionChangeCallback connectionChangeCallback;

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent networkStateIntent = new Intent(NETWORK_AVAILABLE_ACTION);
        networkStateIntent.putExtra(IS_NETWORK_AVAILABLE, isOnline(context));
        LocalBroadcastManager.getInstance(context).sendBroadcast(networkStateIntent);

        if (connectionChangeCallback != null) {
            connectionChangeCallback.onConnectionChange(isOnline(context));
        }
    }


    private boolean isOnline(Context context) {

        try {

            if (context != null) {
                ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
                //boolean isConnected = networkInfo != null && networkInfo.isConnectedOrConnecting();
                return networkInfo != null && networkInfo.isConnected();
            }
            return false;

        } catch (Exception e) {
            Log.e(NetworkReceiver.class.getName(), e.getMessage());
            return false;
        }
    }

    public void setConnectionChangeCallback(ConnectionChangeCallback connectionChangeCallback) {
        this.connectionChangeCallback = connectionChangeCallback;
    }

    public interface ConnectionChangeCallback {

        void onConnectionChange(boolean isConnected);

    }

}

Как этого достичь?

1 Ответ

0 голосов
/ 30 сентября 2019

Удалить static Форма просмотра. Передайте представления в качестве параметра в методе dialog03.

Проверьте этот код.

 TextView tv_check_connection; 
 LinearLayout connection;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample);

    tv_check_connection = (TextView) findViewById(R.id.tv_check_connection_opdipd);
    connection = (LinearLayout) findViewById(R.id.check_connection_opdipd);

// for calling dialog03 method
// dialog03(true, tv_check_connection, connection );
}

public static void dialog03(boolean value, TextView tvCheckConnection, LinearLayout connectionLayout) {


    if (value) {
        tvCheckConnection.setText("Back online");
        connectionLayout.setBackgroundColor(Color.parseColor("#00BE84"));
        connectionLayout.startAnimation(slideDownToUp);
        tvCheckConnection.setTextColor(Color.WHITE);

        Handler handler = new Handler();
        Runnable delayrunnable = new Runnable() {
            @Override
            public void run() {
                if(tvCheckConnection != null){
                   tvCheckConnection.setVisibility(View.GONE);
                }
            }
        };
        handler.postDelayed(delayrunnable, 4000);
    } else {
        tvCheckConnection.setVisibility(View.VISIBLE);
        tvCheckConnection.setText("No connection");
        connectionLayout.startAnimation(slideDownToUp);
        connectionLayout.setBackgroundColor(Color.parseColor("#2D2D2D"));
        tvCheckConnection.setTextColor(Color.WHITE);

    }
}

Поскольку вы обновляете видимость представления после некоторой задержки, его безопасный способ проверяет, что представление не равно нулю.

...