簡體   English   中英

使用循環程序使用自己的線程的Android Java對象

[英]Android Java object with own thread using looper

我試圖在Android中實現可以在其自己的線程中工作的對象(我不想公開處理程序,我想用自己的公共api包裝sendMessage方法)。 它具有將數據傳遞給對象的公共方法。 該對象與活動生命周期(onResume,onPause)相關聯。 我想使用循環器和處理程序,而不僅僅是具有無限循環的純Java線程。 我想在恢復上啟動工作線程,並停止在暫停回調上工作。 對象必須無限等待新消息。 這是我的代碼如下:

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();
        }
    }
}

實施正確嗎? 我收到警告:“在死線程上發送消息給處理程序”。 有沒有我看不到的問題?

這是我的實現:

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
    }
}

在該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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM