«Исключение RuntimeException: не удается создать обработчик внутри потока, который не вызывал Looper.prepare()»

#java #android #multithreading

#java #Android #многопоточность

Вопрос:

 `//some method
Timer timer=new Timer();
    //Handler handler=new Handler();
    timer.scheduleAtFixedRate(new TimerTask()
    {
        public void run()
        {
            loadLayout();
        }

    }, 1000, 10000000);
 //end of method
 public void loadLayout()
 {
    li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);

    params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY |        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.RIGHT | Gravity.TOP;
    myview = li.inflate(R.layout.locked_layout, null);
    wm.addView(myview, params);
 }`     
  

Как вызвать метод WindowMananger.addView(ViewGroup,LayoutParams) внутри потока?
Пожалуйста, помогите мне!!!!!

Ответ №1:

Я думаю, ваша проблема в том, что вы вызываете WindowMananger.addView(ViewGroup,LayoutParams) в отдельном потоке, вы должны вызвать его в UI-thread. Этот код находится в действии, верно? Поэтому просто измените свою временную задачу:

 Timer timer=new Timer();
//Handler handler=new Handler();
timer.scheduleAtFixedRate(new TimerTask()
{
    public void run()
    {       
       runOnUiThread(new Runnable() {

          @Override
          public void run() {
             loadLayout();
          }
      });
    }

}, 1000, 10000000);
  

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

1. не могли бы вы, пожалуйста, сказать мне, как это сделать?

2. Я запускаю это в сервисе. У него нет метода runOnUiThread. Есть ли какой-нибудь метод для вызова его из сервиса?