我已经可以使用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时处理...
答案 0 :(得分:0)
一个简单(但可能不那么漂亮)的解决方案是使用阻塞队列。在生成AsyncTask的主线程中,创建BlockingQueue
并将其设为final
。然后在按下按钮时将一个注释写入队列(您可以将一个字符串写入包含您要发送的数据的队列),并在AsyncTask中创建一个循环,从队列中读取元素并发送它们的内容。 / p>
希望有所帮助。