2015-07-08 1 views
1

Я занимался некоторыми исследованиями и видел некоторые споры о том, использовать ли приемник вещания или диспетчер сигналов тревоги, я не уверен, что использовать, но вот что я пытаюсь сделать и сделал.Проверьте Интернет в фоновом режиме - Android

У меня есть метод, который проверяет наличие интернет-соединения. А затем обновляет интерфейс.

public void isNetworkAvailable() { 
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 

    if (networkInfo != null && networkInfo.isConnected()) { 
     mLayout.removeView(noInternetView); 
     checkInternetViewOpen = false; 
    } else { 
     if (!checkInternetViewOpen) { 
      checkInternetViewOpen = true; 
      mLayout.addView(noInternetView, params); 
     } 
    } 
} 

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

while (usingInternet) { 
    //I need to make it wait 
    isNetworkAvailable(); 

} 

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

Так как я могу сделать это на фоновом потоке? И какой вариант использовать?

Спасибо за помощь заранее.

+0

Одно можно сказать наверняка, если вы хотите обновить интерфейс, вы не сможете сделать это из фонового потока. – Nabin

+0

@Nabin Да, я знаю это, я сказал, что буду редактировать это в будущем. –

+0

Чтобы сделать повторное действие, используйте класс Handler – Nabin

ответ

1

Вы можете создать фоновый поток для проверки этой задачи. Вот мой пример кода.

Осталось только выполнить setNetworkAvaiableUI(), setNetworkNotAvaiableUI() и установить NETWORK_CHECK_INTERVAL.

private boolean isCheckNetworkThreadActive = false; // Flag to indicate if thread is active 
private boolean isNetworkAvaiableUIActive = false; // Flag to indicate which view is showing 
final private static int NETWORK_CHECK_INTERVAL = 5000; // Sleep interval between checking network 

@Override 
protected void onResume() { 
    // Start network checking when activity resumes 
    startCheckNetwork(); 
    super.onResume(); 
} 

@Override 
protected void onPause() { 
    // Stop network checking when activity pauses 
    stopCheckNetwork() 
    super.onPause(); 
} 

private void setNetworkAvaiableUI() { 
    // If network avaible UI is not showing, we will change UI 
    if (!isNetworkAvaiableUIActive) { 
     isNetworkAvaiableUIActive = true; 
     runOnUiThread(new Runnable() { 
      public void run() { 
       // Update UI here when network is available. 
      } 
     }); 
    } 
} 
private void setNetworkNotAvaiableUI() { 
    // If network avaible UI is showing, we will change UI 
    if (isNetworkAvaiableUIActive) { 
     isNetworkAvaiableUIActive = false; 
     runOnUiThread(new Runnable() { 
      public void run() { 
       // Update UI here when network is unavailable. 
      } 
     }); 
    } 
} 

private void startCheckNetwork() { 
    // Only one network checking thread can be run at the time. 
    if (!isCheckNetworkThreadActive) { 
     isCheckNetworkThreadActive = true; 

     Thread checkNetworkThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (isCheckNetworkThreadActive) { 
        if (isNetworkAvailable()) { 
         // Set UI if notwork is available 
         setNetworkAvaiableUI(); 
        } else { 
         // Set UI if notwork is not available 
         setNetworkNotAvaiableUI(); 
        } 

        // Sleep after finish checking network 
        try { 
         Thread.sleep(NETWORK_CHECK_INTERVAL); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
     checkNetworkThread.setName("Check Network Thread"); 
     checkNetworkThread.start(); 
    } 
} 

private void stopCheckNetwork() { 
    // This will break while loop of network checking thread. 
    isCheckNetworkThreadActive = false; 
} 

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

+0

Мне нужно добавить 'checkNetworkThread.interrupt();' при выходе из правильного, так как иначе цикл while останавливается, но поток не пропадет? –

+0

Я не могу найти хороший способ остановить поток при выходе, поскольку «Thread.stop» устарел –

+0

Вам не нужно прерывать поток, потому что при запуске stopCheckNetwork() isCheckNetworkThreadActive становится ложным, а цикл while останавливается, а поток остановится, так как после цикла while нечего запускать. В следующий раз, когда вы хотите снова проверить, вы просто установите isCheckNetworkThreadActive в true и снова запустите поток. FYI, stopCheckNetwork() будет вызываться, когда действие приостанавливается, вы можете переместить его в любом месте. – spicydog

1

Как я понимаю, вы хотите проверить подключение к Интернету и, если оно подключено, вам необходимо выполнить определенные операции либо в backgroung, либо в потоке пользовательского интерфейса.

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

В этой службе напишите A TimerTask, который будет запущен через определенный период. В TimerTask вы записываете данные на общий префикс и когда пользователь открывает приложение, вы можете обновлять пользовательский интерфейс из общих данных

+0

Не могли бы вы добавить несколько примеров? –

+0

Вы можете следить за эту страницу для TimerTask http://examples.javacodegeeks.com/android/core/activity/android-timertask-example/ и этот ответ для вещательного приемника http://stackoverflow.com/questions/ 15698790/broadcast-receiver-for-check-internet-connection-in-android-app – Gaurav

+1

Я видел пример BroadCast Receiver, но как его назвать? И транслируется получение на фоне потока? –

0

Случай 1: Проверьте состояние интернета по всему приложению

Расширение класса приложений и добавить широковещательный приемник в нем.

public class MyApplication extends Application { 

public static boolean isConnected = false; 
/** 
* To receive change in network state 
*/ 
private BroadcastReceiver NetworkStatusReceiver = new BroadcastReceiver() { 

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

     ConnectivityManager connMgr = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 

     isConnected = networkInfo != null && networkInfo.isConnectedOrConnecting(); 

     if (!isConnected) { 
      Toast noInternetToast = Toast.makeText(getApplicationContext(), 
        R.string.no_internet_msg, Toast.LENGTH_LONG); 
      noInternetToast.show(); 
     } 
    } 
}; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    /** Register for CONNECTIVITY_ACTION broadcasts */ 
    registerReceiver(NetworkStatusReceiver, new IntentFilter(
      ConnectivityManager.CONNECTIVITY_ACTION)); 
} 

@Override 
public void onTerminate() { 
    super.onTerminate(); 
    unregisterReceiver(NetworkStatusReceiver); 
} 
} 

В приложения AndroidManifest.xml

<application 
    android:name=".MyApplication" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
</application> 

В любом месте в вашем приложении, вы можете проверить интернет как

if(MyApplication.isConnected){ 
    /** Do your network operation **/ 
} 

Случай 2: В деятельности или фрагмента

Просто добавьте широковещательный приемник в каждое действие или в который нуждается в интернет-статусе.