2016-05-10 2 views
-1

Я пытаюсь использовать SDK, который, кажется, должен создать обработчик в моем сервисе.looper.prepare a ui thread

Появилось сообщение об ошибке, говорящее, что я не могу создать обработчик, если поток не вызвал Looper.prepare(), поэтому я вызываю Looper.prepare(), и эта проблема исчезает. Однако этой службе необходимо запустить активность через некоторое время, и это Looper.prepare(), кажется, возится с ней, так как первая ошибка функции пользовательского интерфейса говорит о том, что она не может быть вызвана из потока, отличного от ui.

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

Ниже мой код упрощен:

public class MyService extends Service implement SDKCallback{ 

... 

void callSDK(){ 

    Looper.prepare(); 
    SDK.run(); //Does thing I don't know about 
} 

@Override 
SDKCallback(){ 

    startActivity(new Intent(this, MyActivity.class); 

} 


} 
+0

Можете ли вы отправить код, пожалуйста? – varunkr

+0

Просто сделал, но я не уверен, если это поможет. Проблема действительно связана с взаимодействием между обработчиком; петлитель и нить. – Laetan

ответ

1

Вы не должны вызывать Looper.prepare(). Попробуйте этот код, чтобы создать Handler,

new Handler(Looper.getMainLooper()) { 
    @Override 
    public void handleMessage(Message message) { 

    } 
}; 

Если вы поставите Looper.prepare() в вашем рабочем потоке, это будет решить первую проблему аварии [нить не называется Looper.prepare()]. Но его нет в потоке пользовательского интерфейса, поэтому вы не можете начать следующий Activity.

Что делает этот выше код, он создает Handler в потоке пользовательского интерфейса. Таким образом, вы можете начать следующий Activity.

Редактировать: Попробуйте это.

@Override 
SDKCallback(){ 

    new Handler(Looper.getMainLooper()) { 
     @Override 
     public void handleMessage(Message message) { 
      startActivity(new Intent(MyService.this, MyActivity.class)); 
     } 
    }; 


} 
+0

Я не могу. Я не тот, кто создает обработчик. SDK делает, и у меня нет доступа к его коду. Есть ли способ изменить петлитель, который использует обработчик, не обращаясь к нему? – Laetan

+0

можете ли вы разместить свой код. – Bob

+0

Я обновил свой ответ. создайте обработчик внутри SDKCallback и попробуйте. @Laetan – Bob