代码示例中的监听器

时间:2016-05-24 18:44:11

标签: java android sockets listener

我正在尝试在Android操作系统中创建一个简单的客户端套接字,并在网上搜索材料时,我偶然发现了一个例子(不是很好写,因为它有一些错误和一个无限循环,但确实如此它的工作是一个简单的例子,其中有一部分代码我无法理解,所以我想也许这个社区可以帮助我,并阐明为什么整个听众部分在那里,它的目的是什么? 以下是有关该侦听器的代码部分:

public interface OnListener {
    void listenerMethod(String text);//never invoked pretty much
}

public class ClientTask extends AsyncTask<String, String, String> implements OnListener {
    @Override
    public void listenerMethod(String text) {//this gets executed after send(View v) method, 'text' String variable contains the msgToSend from phone (from textfield above SEND button)
        sendMessage(text);//invoked by onStop with String variable == "bye"... and it gets stucked in a loop at this point
    }
}

private ClientTask myClientTask;
private OnListener listener;

public void addListener(OnListener listenerToAdd) {//this method is invoked by send(View v)
    this.listener = listenerToAdd;
}

public void send(View v) {//invoked when you press the Send button, empty strings do not get sent (they stop at a trycatch and don't execute any network thingies)
    addListener(myClientTask);//why does it add listener each time a msg is sent?
    if (listener != null)
        listener.listenerMethod(((EditText) findViewById(R.id.editText_MsgToSend)) //this here gets the msg you typed into the editable textfield above SEND button
                .getText().toString());
}

@Override
protected void onStop() {//Restart button invokes this
    try {
        if (listener != null)
            listener.listenerMethod("bye");
        clientSocket.close();
    } catch (Exception e) {
        // TODO: handle exception
    }
    super.onStop();
}

1 个答案:

答案 0 :(得分:0)

这是回调模式,好莱坞原则“不要打电话给我,我会打电话给你”。首先,它定义了类OnListener实现的接口ClientTask,并为其提供了实现。现在ClientTask既是ClientTask类类型又是OnListener类型。 addListener方法只能通过类型为ClientTask的{​​{1}},因为它实现了该接口,这意味着我们可以访问方法的实现

OnListener

稍后我们只调用listenerMethod(String string),它接受​​编辑文本中的任何字符串,然后转到实现OnListener的类(即我们的ClientTask),并发送带有EditText

因此,每次调用send(View v)时,ClientTask中的listenerMethod(String文本)也会被执行。