|
我目前正在開發(fā)Android中的tcp客戶端. 我想將我的Android設(shè)備連接到計(jì)算機(jī)上的tcp服務(wù)器,并每2秒接收一次數(shù)據(jù).問題是由于我在tcp客戶端中實(shí)現(xiàn)的while循環(huán),我正在關(guān)閉我的應(yīng)用程序. 我嘗試以不同的方式編寫將使tcp客戶端檢查服務(wù)器套接字的循環(huán),但沒有成功.如何制作一個(gè)循環(huán)來(lái)檢查服務(wù)器套接字而不關(guān)閉力?
這是我目前正在使用的代碼:
public class Connection implements Runnable {
@Override
public void run() {
try {
sk=new Socket(server,port);
viewsurface.setText("connected");
flag = true;
} catch (UnknownHostException e) {
viewsurface.setText("failed 1 socket");
flag = false;
} catch (IOException e) {
viewsurface.setText("failed 2 socket");
flag = false;
}
while (flag == true){
try {
checkin = sk.getInputStream();
checkint = checkin.available();
if (checkint > 0){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream()));
received = in.readLine();
viewsurface.setText(received);
} catch (IOException e) {
viewsurface.setText("failed to receive");
}
}
Thread.sleep(2000);
} catch (IOException e) {
viewsurface.setText("checkin failed");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} 解決方法: 在任何人提供合適的幫助之前,你需要粘貼你所獲得的異常以使力量關(guān)閉.
但有些建議可能會(huì)解決問題.
>最有可能是問題,viewText.setText只能從UI線程調(diào)用.有很多方法可以解決這個(gè)問題.您可以使用AsyncTask,或者如果您有一個(gè)Activity引用,則可以使用runOnUIThread并傳入一個(gè)調(diào)用setText的runnable. >移動(dòng)checkin = sk.getInputStream();在循環(huán)之前.沒有理由在循環(huán)中的每個(gè)循環(huán)中獲得strem. >不要在循環(huán)中的每個(gè)循環(huán)中創(chuàng)建BufferedReader.在循環(huán)之前移動(dòng)它 > .sleep(2000)并不能完全保證2秒.
我有一些代碼格式問題所以我道歉.
private class DownloadFilesTask extends AsyncTask<Void, String, Void> {
protected Long doInBackground(Void... nothing) {
try {
sk=new Socket(server,port);
publishProgress("connected");
flag = true;
} catch (UnknownHostException e) {
publishProgress("failed 1 socket");
flag = false;
} catch (IOException e) {
publishProgress("failed 2 socket");
flag = false;
}
while (flag == true){
try {
checkin = sk.getInputStream();
checkint = checkin.available();
if (checkint > 0){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(sk.getInputStream()));
received = in.readLine();
publishProgress(received);
} catch (IOException e) {
publishProgress("failed to receive");
}
}
Thread.sleep(2000);
} catch (IOException e) {
updateProgress(
} catch (InterruptedException e) {
e.printStackTrace();
}
return;
}
protected void onProgressUpdate(String... progress) {
viewsurface.setText(progress[0]);
}
protected void onPostExecute(Void result) {
//nothing
}
}
來(lái)源:https://www./content-4-437851.html
|