Running code in main thread from another thread

前端 未结 16 1894
一个人的身影
一个人的身影 2020-11-22 13:50

In an android service I have created thread(s) for doing some background task.

I have a situation where a thread needs to post certain task on main thread\'s message

16条回答
  •  死守一世寂寞
    2020-11-22 14:20

    HandlerThread is better option to normal java Threads in Android .

    1. Create a HandlerThread and start it
    2. Create a Handler with Looper from HandlerThread :requestHandler
    3. post a Runnable task on requestHandler

    Communication with UI Thread from HandlerThread

    1. Create a Handler with Looper for main thread : responseHandler and override handleMessage method
    2. Inside Runnable task of other Thread ( HandlerThread in this case), call sendMessage on responseHandler
    3. This sendMessage result invocation of handleMessage in responseHandler.
    4. Get attributes from the Message and process it, update UI

    Example: Update TextView with data received from a web service. Since web service should be invoked on non-UI thread, created HandlerThread for Network Operation. Once you get the content from the web service, send message to your main thread (UI Thread) handler and that Handler will handle the message and update UI.

    Sample code:

    HandlerThread handlerThread = new HandlerThread("NetworkOperation");
    handlerThread.start();
    Handler requestHandler = new Handler(handlerThread.getLooper());
    
    final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            txtView.setText((String) msg.obj);
        }
    };
    
    Runnable myRunnable = new Runnable() {
        @Override
        public void run() {
            try {
                Log.d("Runnable", "Before IO call");
                URL page = new URL("http://www.your_web_site.com/fetchData.jsp");
                StringBuffer text = new StringBuffer();
                HttpURLConnection conn = (HttpURLConnection) page.openConnection();
                conn.connect();
                InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
                BufferedReader buff = new BufferedReader(in);
                String line;
                while ((line = buff.readLine()) != null) {
                    text.append(line + "\n");
                }
                Log.d("Runnable", "After IO call:"+ text.toString());
                Message msg = new Message();
                msg.obj = text.toString();
                responseHandler.sendMessage(msg);
    
    
            } catch (Exception err) {
                err.printStackTrace();
            }
        }
    };
    requestHandler.post(myRunnable);
    

    Useful articles:

    handlerthreads-and-why-you-should-be-using-them-in-your-android-apps

    android-looper-handler-handlerthread-i

提交回复
热议问题