Android проверка подключения из потока

#android

#Android

Вопрос:

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

 public class DataManager extends Thread {
static final long DELAY = 170000;
Context c;
String stop;

public DataManager(Context argContext) {
    c = argContext;
    stop = "F";
 }

public void StopPlease()
{
    stop = "T";
}  
@Override
public void run() {
       while (true) { 

             try {
                 if (stop=="F")
                 {
                     if(Functions.isOnline(c))
                     {
                         //run the data table loaders for each data type

                         Log.i("MobileViaNetData", "running aircraft data update");
                         DataLoader_Aircraft acloader = new DataLoader_Aircraft(c);
                         acloader.run();
                         Thread.sleep(DELAY);
                     }
                     else
                     {
                         Thread.sleep(DELAY);
                         Toast.makeText(c, "NOT CONNECTED AT THIS TIME", Toast.LENGTH_LONG).show();
                     }
                 }
                 else {
                     break;
                 }
             } catch (InterruptedException e) {
                    e.printStackTrace();
           }
     }
   } 
}

    public class Functions {

    public static boolean isOnline(Context context) 
    {     
        ConnectivityManager cm = (ConnectivityManager)    context.getSystemService(Context.CONNECTIVITY_SERVICE);     
        NetworkInfo netInfo = cm.getActiveNetworkInfo();     
        if (netInfo != null amp;amp; netInfo.isConnected()) 
        {         
            return true;     
        }     
            return false; 
    } 
}
  

Это отлично работает. Но для проверки (при отсутствии Wi-Fi), если я изменю его на «если (! Функции.IsOnline (c))» выдает ошибку

 10-24 13:59:57.970: ERROR/AndroidRuntime(2972): FATAL EXCEPTION: Thread-12
10-24 13:59:57.970: ERROR/AndroidRuntime(2972): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  

ЭТО ПРАВИЛЬНЫЙ СПОСОБ ПРОВЕРКИ ПОДКЛЮЧЕНИЯ?

Ответ №1:

Вы правильно проверяете подключение, но у вас возникают проблемы с потоками. Вместо доступа к необработанным потокам вам следует попробовать использовать и AsyncTask или IntentService . Для вашего конкретного экземпляра я бы изменил DataManager на AsyncTask и в основном скопировал код дословно из вашей run() функции и поместил его в ваш doInBackground() метод.

Комментарии:

1. О, хорошо. Я постараюсь. Хорошая ли идея получать данные в виде AsyncTask?

2. Нет причин, по которым вы не можете.