0

я использую обработчик, чтобы получить значение GCM Я хочу, чтобы обновить это значение в моей базе данныхLooper.prepare() ошибка в потоке

так я называю AsyncTask из обработчика

, но я получаю эту ошибку

java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не называется Looper.prepare()

Я проверил другие решения, они сказали, что я должен поставить код в разделе Run(), который я уже делаем ..

Это код,

private void GetGCM(final String UserID) { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       GCMHelper gcmRegistrationHelper = new GCMHelper(getApplicationContext()); 
       String gcmRegID = ""; 
       gcmRegID = gcmRegistrationHelper.GCMRegister("123456"); 

       // Update using Web Service 
       try { 
        UpdateGCMWSTask updateGCMWSTask = new UpdateGCMWSTask(); 


        updateGCMWSTask.execute(UserID, gcmRegID); 
        // ************ HERE IS THE ERROR *********************** 

       }catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 


      } catch (Exception bug) { 
       bug.printStackTrace(); 
      } 
     } 
    }); 


    thread.start(); 
} 
+0

Я не совсем уверен, что именно этот кусок кода нужен явный фоновый поток в все ... – dhke

+0

Я пытался сделать код GCM более двух недель, и это единственный способ, который работал для меня, теперь я просто хочу сохранить код в базе данных. – asmgx

+0

Как я уже сказал, я не понимаю, почему, но это может быть недостаток понимания с моей стороны. Откуда берется «GCMHelper» и что он делает? Похоже, что код пытается сделать что-то синхронно в главном (UI) потоке. Но если у вас уже есть рабочий поток, почему дополнительный 'AsyncTask'? Или, но это коротко: я не понимаю, но почему-то это выглядит неправильно. – dhke

ответ

1

Добавить Looper.prepare() и Looper.loop() в вас код, например:

private void GetGCM(final String UserID) { 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Looper.prepare(); 
       GCMHelper gcmRegistrationHelper = new GCMHelper(getApplicationContext()); 
       String gcmRegID = ""; 
       gcmRegID = gcmRegistrationHelper.GCMRegister("123456"); 

       // Update using Web Service 
       try { 
        UpdateGCMWSTask updateGCMWSTask = new UpdateGCMWSTask(); 


        updateGCMWSTask.execute(UserID, gcmRegID); 
        // ************ HERE IS THE ERROR *********************** 

       }catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 

       Looper.loop(); 
      } catch (Exception bug) { 
       bug.printStackTrace(); 
      } 
     } 
    }); 

    thread.start(); 
} 
1

Вы не можете создать AsyncTask внутри нити. Существует несколько способов его устранения:

  1. Создайте новый обработчик.

  2. Функция вызова runOnUIThread активности.

  3. Использование радиовещания.

Смежные вопросы