我有一个应用程序可以监听指示的ip和端口。我知道如何连接,如何接收数据。
事情是:
这是我用来获取数据的类:
public final class MyClientTask extends AsyncTask<Void, Void, Void> {
BufferedReader br = null;
String dstAddress;
int dstPort;
String response = "";
public MyClientTask(String addr, int port){
dstAddress = addr;
dstPort = port;
}
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
ByteArrayOutputStream byteArrayOutputStream =
new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
//Instanciation de l'inputStreamReader
InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
// creation nouveau bufferreader
br = new BufferedReader(inputStreamReader);
StringBuilder msgBuilder = new StringBuilder();
// on évite String = String + char qui fait des créations de builders automatiques en java.
boolean ended = false;
while (!ended) {
int nextChar = inputStreamReader.read();
if (nextChar == -1) {
ended = true; // <= fin du stream
} else if (nextChar == 03) {
String maChaine="";
// fin du message
maChaine = msgBuilder.toString();
//récupération du char après <STX>
Character nbChamps = maChaine.charAt(1);
//test pour savoir si c'est une alerte
if(nbChamps == '7'){
//insertion de l'alerte dans la BDD
BDDAlerte.insertAlerte1(maChaine);
//creation de la notif
createNotification();
}
//ici les tests splits pour le nombre de champs et inserer dans BdD ou faire ce qu'il faut
//suppVieillesAlertes();
runOnUiThread(new Runnable() {
@Override
public void run() {
//find listview to populate
final ListView lvItems = (ListView)findViewById(R.id.listView1);
//setup cursor adapter using Cursor from last step
final AlerteAdapter todoAdapter = new AlerteAdapter(getBaseContext(), BDDAlerte.getAllRows(),0);
lvItems.setAdapter(todoAdapter);
}
});
// réinitialisation du builder
msgBuilder.setLength(0);
} else {
msgBuilder.append((char)nextChar);
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "UnknownHostException: " + e.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "IOException: " + e.toString();
}
finally{
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}
我的退出按钮位于onOptionsItemSelected的应用程序菜单中。
如果我没有提供所有数据,我会在这里解决问题。
西蒙
答案 0 :(得分:0)
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
在构造套接字之前,应首先检查网络状态
如果在读取数据时抛出异常,则意味着连接丢失。
你可以定义一个布尔字段“running”,initial为true,在应用程序退出时将其设置为false,在循环中检查它的值,如下所示:
while (!ended&&running) {
int nextChar = inputStreamReader.read();
if (nextChar == -1) {
ended = true; // <= fin du stream
}
// ......
}
答案 1 :(得分:0)
首先创建一个单独的类来检查连接并通过调用方法来放置条件,而不仅仅是继续进行套接字..
公共类MobileConnectivity {
curses