Проверьте интернет-соединение от AsyncTask - PullRequest
0 голосов
/ 28 апреля 2018

Это не дубликат

Я хочу проверить подключение к Интернету в реальном времени с моего activity, используя AsyncTask и Handler, чтобы отобразить или скрыть TexView, если подключение доступно или нет. Но это не работает.

Мой код вызывает исключение NetworkOnMainThreadException даже при использовании AsyncTask

Я использую этот код:

class  CheckNetWorkConnection  extends AsyncTask<String, Void,Boolean>{
MyActivity activity;
    public checkNetWorkConnection(MyActivity activity) {
        this.activity= activity;

    }

    @Override
    protected Boolean doInBackground(String... strings) {
        boolean networkAvalaible;

                try {
                    URL myUrl = new URL("https://www.stackoverflow.com");
                    URLConnection connection = myUrl.openConnection();
                    connection.setConnectTimeout(3000);
                    connection.connect();

                    networkAvalaible = true;
                } catch (Exception e) {
                  //I'm catching NetworkInMainThreadException here 
                    e.printStackTrace();
                    networkAvalaible = false;
                }
            }
        });

   // doInBackground always retun false
        return networkAvalaible;
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {

    // Using handler to repeat Task


        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (aBoolean){
                    activity.noConnection.setVisibility(View.GONE);
                }else {

                    activity.noConnection.setVisibility(View.VISIBLE);
                }
            }

        },3000);


        super.onPostExecute(aBoolean);
    }
}

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Поместите этот класс в ваш util Пакет для подключения к Интернету в любом месте вашего проекта.

ConnectionDetector.java

package util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

/**
 * Created by Pranav on 29/08/16.
 */
public class ConnectionDetector {
    private Context _context;

    public ConnectionDetector(Context context) {
        this._context = context;
    }

    public boolean isConnectingToInternet() {
        ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (int i = 0; i < info.length; i++)
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
        }
        return false;
    }
}

Вот фрагмент кода, если MainActivity.java проверить подключение к Интернету, а если подключение к Интернету включено, то вызовите asynctask, в противном случае выдайте тост-сообщение.

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.Toast;

import java.net.URL;
import java.net.URLConnection;

import util.ConnectionDetector;

/**
 * Created by Pranav on 29/08/16.
 */


public class CaseDetaiksActivity extends Activity {

    public static Context context;
    ConnectionDetector mConnectionDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        mConnectionDetector = new ConnectionDetector(context);
        setContentView(R.layout.activity_mail);

        if (mConnectionDetector.isConnectingToInternet()) {
            MyAyncTask MyTask = new MyAyncTask();
            MyTask.execute();
        } else {
            Toast.makeText(context, getString(R.string.please_check_internet), Toast.LENGTH_SHORT).show();
        }
    }

    public static class MyAyncTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            // You can track you progress update here
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                URL myUrl = new URL("https://www.stackoverflow.com");
                URLConnection connection = myUrl.openConnection();
                connection.setConnectTimeout(3000);
                connection.connect();

            } catch (Exception e) {
                //I'm catching NetworkInMainThreadException here
                e.printStackTrace();
            }
            return null;
        }
    }
}

Надеюсь, это поможет вам

0 голосов
/ 28 апреля 2018
  1. a. Создание класса приемника вещания

      public class NetworkChangeReceiver extends BroadcastReceiver {
    
      @Override
      public void onReceive(final Context context, final Intent intent) {
    
      if(checkInternet(context)){
        Toast.makeText(context, "Network Available Do operations",Toast.LENGTH_LONG).show(); 
        }
      }
    
     public boolean checkInternet(Context context) {
        ServiceManager serviceManager = new ServiceManager(context);
        if (serviceManager.isNetworkAvailable()) {
        return true;
        } else {
        return false;
         }
       }
     }    
    

    б. Создать класс Service Manager

    public class ServiceManager {
      Context context;
    
      public ServiceManager(Context base) {
          context = base;
       }
    
      public boolean isNetworkAvailable() {
          ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkInfo networkInfo = cm.getActiveNetworkInfo();
          return networkInfo != null && networkInfo.isConnected();  
     }
    }
    
  2. Регистрация разрешений в манифесте Android

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
    
  3. Объявление широковещательного приемника в манифесте Android

      <receiver android:name=".receivers.NetworkChangeReceiver">
          <intent-filter>
              <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
          </intent-filter>
      </receiver>
    
  4. В вашей деятельности:

    а. зарегистрируйте свой вещательный приемник в onResume ()

        registerReceiver(new NetworkChangeReceiver() , new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    

    б. отмените регистрацию вашего приемника вещания в onPause ();

        unregisterReceiver(new NetworkChangeReceiver());
    
0 голосов
/ 28 апреля 2018

чтобы использовать его, звоните

new CheckNetWorkConnection().execute(); 

вы хотите, чтобы ваша асинхронная задача выполнялась бесконечно, пока не будет потеряно интернет-соединение. Ваш текущий код будет проверяться только один раз.

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

@Override
protected Boolean doInBackground(String... strings) {
    boolean networkAvalaible = false;

    do {
            try {
                URL myUrl = new URL("https://www.stackoverflow.com");
                URLConnection connection = myUrl.openConnection();
                connection.setConnectTimeout(3000);
                connection.connect();

                networkAvalaible = true;

                sleep(5000); //check connection every 5 seconds.

// you can call publish progress here to tell your process that 
// connection is available

            } catch (Exception e) {
              //I'm catching NetworkInMainThreadException here 
                e.printStackTrace();
                networkAvalaible = false;
            }
     } while (networkAvalaible); 

//you only exit and asyncTask when connection is lost.


    return networkAvalaible;
}

AsyncTask - неправильный способ сделать это, хотя ... взгляните на следующую статью ниже. https://www.grokkingandroid.com/android-getting-notified-of-connectivity-changes/

...