Android 通过带按钮的插座连接
是我被这个问题困扰的日子。我创建了一个带有片段和选项卡的应用程序,我必须插入一个按钮,当单击该按钮时,它会连接到某个ip和某个端口,我不知道如何写入和放置它,它们只能在启动mainActivity时连接,但我希望可以通过按钮控制它,你能帮忙吗?首先,对于最新版本的Android framework,所有网络操作都不能从主线程(即管理UI的线程)执行。因此,您需要使用自己的线程进行连接 例如:Android 通过带按钮的插座连接,android,sockets,button,android-activity,Android,Sockets,Button,Android Activity,是我被这个问题困扰的日子。我创建了一个带有片段和选项卡的应用程序,我必须插入一个按钮,当单击该按钮时,它会连接到某个ip和某个端口,我不知道如何写入和放置它,它们只能在启动mainActivity时连接,但我希望可以通过按钮控制它,你能帮忙吗?首先,对于最新版本的Android framework,所有网络操作都不能从主线程(即管理UI的线程)执行。因此,您需要使用自己的线程进行连接 例如: package it.resis.solarapp.activities.fourcloud.appli
package it.resis.solarapp.activities.fourcloud.application;
import it.resis.solarapp.R;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class CopyOfActivity4CloudConfiguration extends Activity {
private volatile Socket socket = null;
private boolean connectionOk = false;
private Button buttonDisconnect;
private Button buttonConnect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
buttonConnect = findViewById(R.id.buttonConnect);
buttonConnect.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
InetSocketAddress addr = new InetSocketAddress("192.168.1.1", 80);
new ConnectToIpTask().execute(addr);
}
});
buttonDisconnect = findViewById(R.id.buttonDisconnect);
buttonConnect.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
new CloseSocket().execute();
}
});
buttonDisconnect.setEnabled(false);
buttonConnect.setEnabled(true);
}
private class ConnectToIpTask extends AsyncTask<InetSocketAddress, Void, Boolean> {
@Override
protected Boolean doInBackground(InetSocketAddress... params) {
InetSocketAddress addr = params[0];
try {
socket = new Socket(addr.getAddress().toString(), addr.getPort());
} catch (UnknownHostException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
connectionOk = result;
// update here the ui with result
if (result) {
buttonDisconnect.setEnabled(true);
buttonConnect.setEnabled(false);
}
}
}
private class CloseSocket extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
socket.close();
} catch (Exception ex) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
buttonDisconnect.setEnabled(false);
buttonConnect.setEnabled(true);
}
}
}
package it.resis.solarapp.activities.fourcloud.application;
导入it.resis.solarapp.R;
导入java.io.IOException;
导入java.net.InetSocketAddress;
导入java.net.Socket;
导入java.net.UnknownHostException;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
公共类CopyOfActivity4CloudConfiguration扩展活动{
私有易失性套接字=空;
私有布尔连接OK=false;
专用按钮断开连接;
私人按钮连接;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_布局);
buttonConnect=findViewById(R.id.buttonConnect);
buttonConnect.setOnClickListener(新建Button.OnClickListener(){
@凌驾
公共void onClick(视图v){
InetSocketAddress addr=新的InetSocketAddress(“192.168.1.1”,80);
新建ConnectToIpTask().execute(addr);
}
});
buttonDisconnect=findViewById(R.id.buttonDisconnect);
buttonConnect.setOnClickListener(新建Button.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建CloseSocket().execute();
}
});
buttonDisconnect.setEnabled(假);
buttonConnect.setEnabled(true);
}
私有类ConnectToIpTask扩展异步任务{
@凌驾
受保护的布尔doInBackground(InetSocketAddress…参数){
InetSocketAddress addr=params[0];
试一试{
套接字=新套接字(addr.getAddress().toString(),addr.getPort());
}捕获(未知后异常e){
e、 printStackTrace();
返回false;
}捕获(IOE异常){
e、 printStackTrace();
返回false;
}
返回true;
}
@凌驾
受保护的void onPostExecute(布尔结果){
super.onPostExecute(结果);
connectionOk=结果;
//在这里用结果更新ui
如果(结果){
buttonDisconnect.setEnabled(true);
buttonConnect.setEnabled(假);
}
}
}
私有类CloseSocket扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
socket.close();
}捕获(例外情况除外){
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
buttonDisconnect.setEnabled(假);
buttonConnect.setEnabled(true);
}
}
}
我可以,我更改了代码行
发件人:
到
多亏了所有这些通过socketif连接到ip后发生了什么?如果我无法连接以发送和接收数据,请在最后用另一个按钮关闭连接。现在,它崩溃了,无法连接。我复制了你的代码,不幸的是它无法工作,手机似乎无法连接。pulstante“disconnect”仍然处于禁用状态。我不知道这是否重要,但eclipse通过添加按钮(Button)强迫我更改代码行,例如:buttonDisconnect=(Button)findViewById(R.id.buttonClose);
@Override
protected Boolean doInBackground(InetSocketAddress... params) {
InetSocketAddress addr = params[0];
try {
**socket = new Socket(addr.getAddress().toString(), addr.getPort());**
} catch (UnknownHostException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
protected Boolean doInBackground(InetSocketAddress... params) {
InetSocketAddress addr = params[0];
try {
**socket = new Socket("192.168.1.1", 80);**
} catch (UnknownHostException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}