【问题标题】:show snackbar if their is no internet connection如果他们没有互联网连接,则显示小吃吧
【发布时间】:2017-08-30 18:33:43
【问题描述】:

在这里我有一个飞溅活动,在这里我希望它在找不到互联网连接时产生小吃店按摩,并且其中还有一个重试选项....当单击重试时再次检查互联网连接然后转到下一步活动....帮帮我

package com.apkglobal.pocket;

import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.WindowManager;

import com.apkglobal.pocket.R;

public class SplashActivity extends AppCompatActivity {
    private static int SPLASH_TIME_OUT=2000;

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

        getSupportActionBar().hide();
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

        new Handler().postDelayed(new Runnable(){
            @Override
            public void run(){
                Intent i= new Intent(SplashActivity.this,NavigationActivity.class);
                startActivity(i);
                finish();
            }
        }, SPLASH_TIME_OUT);
    }
}

【问题讨论】:

  • 您目前遇到的具体问题是什么?我没有看到您尝试使用小吃店的任何代码
  • 我是初学者我不知道如何实现它..建议一些东西..

标签: android


【解决方案1】:

这里是 ping 服务器的简单解决方案,然后在主线程上返回结果

    private void showSnackIfOffline(){
    final boolean online = isOnline();
    runOnUiThread(new TimerTask() { //must run on main thread to update UI (show Snackbar), can be used only in Activity (FragmentActivity, AppCompatActivity...)
        @Override
        public void run() {
            if(!online)
                Snackbar.make(findViewById(android.R.id.content), "Sorry, you're offline", Snackbar.LENGTH_SHORT);
            else{
                /*
                    Your code here if user is online
                */
            }
        }
    });
}

private boolean isOnline(){
    try {
        return Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor() == 0; //  "8.8.8.8" is the server to ping
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

【讨论】:

    【解决方案2】:

    我的示例实现,在 Kotlin 中使用 Snackbar 通知网络状态。也许它会帮助某人。我做了监听网络的状态。 Snackbar 会在任何屏幕上弹出!

    interface INetworkAvailabilityNotification {
        fun init()
    }
    
    class NetworkAvailabilityNotificationImpl(
            val context: Context,
            private val networkStateProvider: INetworkStateProvider,
            resourcesInteractor: IResourcesInteractor) : INetworkAvailabilityNotification {
    
    private var weekReferenceActivity: WeakReference<Activity>? = null
    private var snackbar: Snackbar? = null
    private val networkUnavailableText: String by lazy { resourcesInteractor.getString(R.string.network_unavailable_error) }
    
    override fun init() {
        initActivityCallback()
        initOnlineListener()
    }
    
    private fun showSnackbar(message: String) {
        initSnackBar()
        setText(message)
        snackbar?.show()
    }
    
    private fun setViewParams() {
        snackbar?.let {
            val layoutParams =
                    (it.view.layoutParams as FrameLayout.LayoutParams)
                            .also { lp -> lp.setMargins(0, 0, 0, 0) }
            it.view.setBackgroundColor(Color.BLACK)
            it.view.layoutParams = layoutParams
            it.view.alpha = 0.90f
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                it.view.elevation = 0f
            }
        }
    }
    
    private fun initActivityCallback() = (context as? Application)?.registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacksImpl() {
        override fun onActivityResumed(activity: Activity?) {
            activity?.let { weekReferenceActivity = WeakReference(activity) }
        }
    })
    
    private fun initSnackBar() = weekReferenceActivity?.get()?.findViewById<View>(android.R.id.content)?.let { view ->
        if (weekReferenceActivity?.get() is AppCompatActivity) {
            snackbar = Snackbar.make(view, "", Snackbar.LENGTH_INDEFINITE).setBehavior(NoSwipeBehavior())
            setViewParams()
        }
    }
    
    private fun initOnlineListener() {
        networkStateProvider.isOnline.observe { isOnline ->
            if (isOnline) snackbar?.dismiss() else showSnackbar(networkUnavailableText)
        }
    }
    
    private fun setText(message: String) {
        val spannableString = SpannableString(message).apply {
            setSpan(ForegroundColorSpan(ContextCompat.getColor(context, R.color.white)), 0, message.length, 0)
        }
        snackbar?.setText(spannableString)
    }
    }
    
    internal class NoSwipeBehavior : BaseTransientBottomBar.Behavior() {
        override fun canSwipeDismissView(child: View): Boolean = false
    }
    
    open class ActivityLifecycleCallbacksImpl : Application.ActivityLifecycleCallbacks {
        override fun onActivityPaused(activity: Activity?) {}
        override fun onActivityResumed(activity: Activity?) {}
        override fun onActivityStarted(activity: Activity?) {}
        override fun onActivityDestroyed(activity: Activity?) {}
        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {}
        override fun onActivityStopped(activity: Activity?) {}
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {}
    
    }
    

    网络状态类

    interface INetworkStateProvider {
        val stateLiveData: LiveData<SealedNetworkState>
        val isOnline: LiveData<Boolean>
    }
    
    class NetworkStateProviderImpl(private val context: Context) : INetworkStateProvider {
    
        private companion object {
            const val CONNECTIVITY_CHANGE = "android.net.conn.CONNECTIVITY_CHANGE"
            const val WIFI_STATE_CHANGED = "android.net.wifi.WIFI_STATE_CHANGED"
        }
    
        private val connectivityManager: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        private val broadcastReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) = this@NetworkStateProviderImpl.onReceive()
        }
        override val stateLiveData: MutableLiveData<SealedNetworkState> = object : MutableLiveData<SealedNetworkState>() {
            override fun onActive() = registerBroadcastReceiver()
            override fun onInactive() = unregisterBroadcastReceiver()
        }
        override val isOnline: MutableLiveData<Boolean> = stateLiveData.map {
            connectivityManager.activeNetworkInfo?.isConnected == true
        }.distinctUntilChanged()
    
    
        private fun registerBroadcastReceiver() {
            context.registerReceiver(broadcastReceiver, IntentFilter().apply {
                addAction(CONNECTIVITY_CHANGE)
                addAction(WIFI_STATE_CHANGED)
            })
        }
    
        private fun unregisterBroadcastReceiver() = context.unregisterReceiver(broadcastReceiver)
    
        private fun getConnectivityStatus(): SealedNetworkState = if (connectivityManager.activeNetworkInfo?.isConnected == true) {
            when (connectivityManager.activeNetworkInfo?.type) {
                ConnectivityManager.TYPE_WIFI -> SealedNetworkState.NetworkWiFi
                ConnectivityManager.TYPE_MOBILE -> SealedNetworkState.NetworkMobile
                else -> SealedNetworkState.NetworkOther
            }
        } else SealedNetworkState.NetworkNone
    
        private fun onReceive() = with(getConnectivityStatus()) {
            if (this != stateLiveData.value) stateLiveData.postValue(this)
        }
    }
    
    sealed class SealedNetworkState {
        object NetworkWiFi : SealedNetworkState()
        object NetworkMobile : SealedNetworkState()
        object NetworkOther : SealedNetworkState()
        object NetworkNone : SealedNetworkState()
    }
    

    【讨论】:

      【解决方案3】:

      在 Kotlin 中,检查互联网是否可用:

      private fun isOnline(): Boolean {
              val connectivityManager =
                      getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
              val capabilities =
                      connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
              if (capabilities != null) {
                  when {
                      capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                          Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
                          return true
                      }
                      capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                          Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
                          return true
                      }
                      capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
                          Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
                          return true
                      }
                  }
              }
              return false
          }
      

      在没有互联网时显示带有设置选项的小吃店:

      private fun showNoNetSnackbar() {
              val snack = Snackbar.make(rootView, "No Internet!", Snackbar.LENGTH_LONG) // replace root view with your view Id
              snack.setAction("Settings") {
                  startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
              }
              snack.show()
          }
      

      启用 WiFi 后,在 onResume 中做任何你想做的事情。

      【讨论】:

        【解决方案4】:

        试试这个

        if(!isConnectedToInternet()){
        //Show snackbar..please tell me you know how to show a snackbar
        }
        
        private boolean isConnectedToInternet(Context context) {
                ConnectivityManager cm =
                        (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                return netInfo != null && netInfo.isConnectedOrConnecting();
            }
        

        在您的 AndroidManifest.xml 中添加此权限

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        

        【讨论】:

        【解决方案5】:
        1. 试试这个希望对你有帮助,

         private boolean isConnectedToInternet(Context context) {
            ConnectivityManager cm =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            return netInfo != null && netInfo.isConnectedOrConnecting();
        }
        

        1. Snackbar 制作方法并在此处调用它

            if(!isConnectedToInternet()){
             showSnackBar("please check your internet connection",your_layout_name);
         }
        public void showSnackBar(String string, LinearLayout linearLayout)
        {
            snackbar = Snackbar
                    .make(linearLayout, string, Snackbar.LENGTH_INDEFINITE).
                            setAction("Ok", new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
        
                                    snackbar.dismiss();
                                }
                            });
            snackbar.show();
             }
        

        快乐编码:)

        【讨论】:

        • 但是如果用户点击它,我想重试再次检查互联网连接
        • 使用和上​​面我在“OK”中说的一样 if(!isConnectedToInternet()){ showSnackBar("please check your internet connection","这里你​​必须通过父布局id"); }
        猜你喜欢
        • 2019-12-17
        • 2022-11-26
        • 1970-01-01
        • 2020-10-18
        • 2017-01-07
        • 1970-01-01
        • 2019-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多