簡體   English   中英

Android:如何創建一個等待服務器消息並更新UI的線程?

[英]Android: How to make a thread which waits for server messages and updates the UI?

我已經制作了一個Java服務器和Java客戶端程序,可以與發送String消息的TCP套接字進行通信。 這些java程序運行完美。 客戶端邏輯是它具有一個UI和一個線程 ,該線程一直在等待新消息並相應地更新UI接收到的消息( 例如添加按鈕,設置按鈕可見,更改文本 )。

現在,我對android完全陌生,我想為android做一個平等的客戶,但我遇到了這些問題:

1)我不能僅通過參數(如java)從后台線程更新UI。

2)我希望一個線程更新2或3個活動(我需要2-3個活動,因為缺少屏幕空間)

我已經閱讀了有關AsyncTask的信息,但他們說建議將其用於排序任務,然后我閱讀了有關帶有處理程序的線程的信息,但他們說很難使用,並且感到困惑。 所以我的問題是我應該在android上使用哪種方法來實現“ 消息監聽器/ UI更新器 ”線程。

更新 :好的,我使用了線程和處理程序,並且我的主要活動得到了更新,但是現在我如何也可以從該線程更新第二個Activitie?

好了,您可以在一個特定的時間啟動一個線程,然后檢查服務器是否有任何消息,如果沒有,則重新啟動該線程或執行您的工作。 希望這會有所幫助。

您可以像com.example.a41264.myapplication這個程序包一樣實現它;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * Created by 41264 on 04/23/17.
 */

public class Client implements Runnable{
   final  CopyOnWriteArrayList<MsgListener> listeners = new CopyOnWriteArrayList<>();
    @Override
    public void run() {
        Socket socket = new Socket();
        try {
            int yourPort = 0;
            SocketAddress address = new InetSocketAddress("your ip",yourPort);
            socket.connect(address);
            int your_buffer_size = 1024;
            byte[] buffers = new byte[your_buffer_size];
            InputStream is = socket.getInputStream();
            int resultLength;
            String msg;
            while(true){
                resultLength = is.read(buffers);
                msg = new String(buffers,0,resultLength);
                if(listeners.size() != 0){
                    for(MsgListener msgListener: listeners){
                        msgListener.onMsgRecived(msg);
                    }
                }
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void addListener(MsgListener listener){
        listeners.add(listener);
    }
    public void removeListener(MsgListener listener){
        listeners.remove(listener);
    }

    public interface MsgListener{
        void onMsgRecived(String msg);
    }
}

並在這樣的活動中做你的工作

package com.example.a41264.myapplication;

import android.app.Activity;
import android.util.Log;

/**
 * Created by 41264 on 04/23/17.
 */

public class YourActivity extends Activity{

    private Client client; //you need to get your clent;

    private Client.MsgListener msgListener = new Client.MsgListener() {
        @Override
        public void onMsgRecived(final String msg) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //do your own work in main thread
                    Log.i("tag",msg);
                }
            });
        }
    };

    @Override
    protected void onRestart() {
        super.onRestart();
        client.addListener(msgListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        client.removeListener(msgListener);
    }
}

暫無
暫無

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

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