0

я имел следующий код, который вызывается в классе, который был зарегистрирован для получения периодического (1 раз в секунду) передач:Android AsyncTask Logging терпит неудачу

public void onReceive(Context c, Intent i) { 
    Log.d("NET", "Polling server..."); 
    try { 
     Request.getChanges(); 
    } catch (Exception e) { 
     Log.w("NET", "Error polling server: " + e.toString()); 
    } 
} 

Однако, поскольку этот код был быть выпалил, как BroadcastReceiver, и, таким образом, становится работать в потоке пользовательского интерфейса, я получаю:

Error polling server: android.os.NetworkOnMainThreadException 

Так что я решил попробовать его в AsyncTask вместо:

public void onReceive(Context c, Intent i) { 
    class Task extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      Log.d("NET", "Polling server..."); 
      try { 
       Request.getChanges(); 
      } catch (Exception e) { 
       Log.w("NET", "Error polling server: " + e.toString()); 
      } 
      return null; 
     } 
    } 
    new Task().execute(); 
} 

Однако, когда я это делаю, я не получаю никакого вывода. Подумайте, в чем проблема? Благодаря!

+0

Почему вы не обернуть его просто ниткой (...)? – nKn

+0

Как я понимаю, AsyncTask в основном представляет собой оболочку вокруг нереста нового потока, что делает процесс немного проще. – joshlf

+0

Есть ли у вас еще одна AsyncTask, кроме этого в вашем приложении? – nKn

ответ

1

Кажется, вы ударили по той же стене, что и я несколько недель назад. У меня уже был один AsyncTask, отлично работающий, я скопировал ту же структуру для другой, попытался запустить ее - никакого результата. Я уже сошел с ума, когда достиг this.

Резюмируя, все, что вам нужно сделать, это:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1) 
    new Task().execute(); 
else 
    new Task().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
+0

Это исправлено; благодаря! – joshlf