0

Я попытался реализовать объект в Android, который будет работать в своем потоке (я не хочу, чтобы обработчик был общедоступным, я хочу, чтобы wrapedMessage-метод с собственным public api). Он имеет общедоступные методы для передачи данных объекту. Этот объект связан с жизненным циклом активности (onResume, onPause). Я хотел бы использовать looper и обработчик, а не только чистый поток Java с бесконечным циклом. Я хочу запустить рабочий поток в резюме и перестать работать с обратным вызовом. Объект должен бесконечно ждать нового сообщения. Это мой код ниже:Android Java-объект с собственным потоком с использованием looper

public class ThreadingObject { 

    private MyThread thread; 

    public ThreadingObject() {} 

    public void onResume() { 
     thread = new MyThread(); 
     thread.startWorking(); 
    } 

    public void onPause() { 
     thread.stopWorking(); 
    } 

    public void setMessage(Object object) { 
     Message msg = new Message(); 
     msg.obj = object; 
     thread.handler.sendMessage(msg); 
    } 

    protected void work(Object object) { 
     //Do something with object in own thread 
    } 

    private class MyThread extends Thread { 
     public Handler handler; 

     @Override 
     public void run() { 
      Looper.prepare(); 
      handler = new Handler() { 

       @Override 
       public void handleMessage(Message msg) { 
        ThreadingObject.this.work((String[]) msg.obj); 
       } 
      }; 
      Looper.loop(); 
     } 

     public void startWorking() { 
      start(); 
     } 

     public void stopWorking() { 
      handler.getLooper().quit(); 
     } 
    } 
} 

Правильно ли реализация? Я получаю предупреждение: «отправка сообщения обработчику по мертвой теме». Есть ли какая-то проблема, которую я не вижу?

+0

Вы Тринг, чтобы написать свой собственный 'HandlerThread'? – Selvin

+0

Я читал о HandlerThread, и я думаю, что один из них - это то, что HandlerThread готовит Looper и Handler для меня. Есть ли у вас какой-либо пример, как я могу запустить и остановить поток в безопасном режиме (а не thread.join(), конечно)? – piotrek00

+1

https://gist.github.com/SelvinPL/eaf75cf244df4d2f2ee6? – Selvin

ответ

0

Это моя реализация:

public class ThreadingObject { 

    private HandlerThread thread; 
    private Handler handler; 

    private Handler.Callback handlerCallback = new Handler.Callback() { 
     @Override 
     public boolean handleMessage(Message msg) { 
      work(msg.obj); 
      return true; 
     } 
    }; 

    public ThreadingObject() {} 

    public void onResume() { 
     thread = new HandlerThread("SurfaceView HandlerThread"); 
     thread.start(); 
     handler = new Handler(thread.getLooper(), handlerCallback); 
    } 

    public void onPause() { 
     if(thread != null) { 
      thread.quit(); 
      thread = null; 
     } 
     handler = null; 
    } 

    public void setMessage(Object object) { 
     Message msg = new Message(); 
     msg.obj = object; 
     handler.sendMessage(msg); 
    } 

    protected void work(Object obj) { 
     //Working 
    } 
} 
-1

В этом методе run(), если вам нужно повторно запустить или использовать цикл, вам нужно добавить его самим, например.

и ваша ошибка, случается, потому что вы пытаетесь назвать уже завершенную нить.

boolean aLoopLoopLoop = true; 
    Handler handler; 

    // this handler, you no need to declare it repeatedly, just declare it in onCreate() is enough 
    handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      ThreadingObject.this.work((String[]) msg.obj); 
     } 
    }; 

    // ----- 
    @Override 
    public void run() { 
     Looper.prepare(); 
     final Looper looper = Looper.myLooper(); 
     while(aLoopLoopLoop) { 
      // write your code here 
      Looper.loop(); 
     } 
     // after loop exit, quit loop 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       looper.quit(); 
      } 
     }, 3000); 
    } 

    // ----- 
    public void stopWorking() { 
     aLoopLoopLoop = false; 
    }