在片段上单击按钮时,通过套接字将消息发送到服务器

时间:2016-08-21 21:16:54

标签: java android sockets android-fragments android-asynctask

我已经可以使用AsyncTask从服务器收到多条消息,而且我也知道如何发送。

当我从多个片段中断/拉动按钮时,我不知道如何发送消息。

片段A上有1个按钮,片段B上有1个按钮。

片段A

public class Fragmento_A extends android.support.v4.app.Fragment{

    Button button;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.activity_third,container,false);

        button = (Button) v.findViewById(R.id.button);

        new Cliente("192.168.2.5",6000,button,Fragment_B.button).execute();

        return v;
    }
}

片段B

public class Fragmento_B extends android.support.v4.app.Fragment{

    public static Button button;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.activity_third,container,false);

        button = (Button) v.findViewById(R.id.button);

        return v;
    }
}

的AsyncTask

public class Cliente extends AsyncTask<Void, String, Void> {

    String dstAddress;
    int dstPort;
    Button button,button2

    public Cliente(String addr, int port, Button button, Button button2) {

    this.button = button;
    this.button2 = button2;
    }

    @Override
    protected Void doInBackground(Void... arg0) {
            Socket socket = null;
            try {
                socket = new Socket(dstAddress, dstPort);
                while(true) {

                     //what to do here?
                }

            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {}

当在Fragment_A上单击一个按钮时,它应该发送:按下Button_A(仅执行一次),当在Fragment_B上单击一个按钮时,它应该发送:Button_B按下(也只执行一次)。

或许最简单的方法是始终将按钮的状态发送到服务器,服务器在获取确定的字符串/ int时处理...

1 个答案:

答案 0 :(得分:0)

一个简单(但可能不那么漂亮)的解决方案是使用阻塞队列。在生成AsyncTask的主线程中,创建BlockingQueue并将其设为final。然后在按下按钮时将一个注释写入队列(您可以将一个字符串写入包含您要发送的数据的队列),并在AsyncTask中创建一个循环,从队列中读取元素并发送它们的内容。 / p>

BlockingQueue

希望有所帮助。

相关问题