今から(ICS +)、ネットワーク接続を行うには、制限を解除したくない場合(非推奨!)、AsyncTask(またはハンドラ)を使用する必要があります。ネットワーク接続は、デフォルトでは主な活動スレッドから制限されています。
このAsyncTaskはトリックです(反対側には私はC++ソケットサーバーを持っていました)。この場合、私はソケットを開き、メインアクティビティから受け取った文字列を送信し、応答を受け取り、別のメッセージ(今回は "こんにちは")を送信し、接続を閉じる前に最後のメッセージを受け取ります。 (トライキャッチ以内)を使用して
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.AsyncTask;
import android.util.Log;
public class SocketConnect extends AsyncTask <String, Integer, String> {
String TAG = "TGsocket";
@Override
protected String doInBackground(String... params) {
String url = params[0];
String textSend = params[1];
Log.i(TAG, "textsend = |" + textSend + "|");
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket(url, 9090);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
Log.i(TAG,"socket OK");
dataOutputStream.writeUTF(textSend);
String textInNow = dataInputStream.readLine();
Log.w(TAG, "says Server = " + textInNow);
dataOutputStream.writeUTF("hello there");
textInNow = dataInputStream.readLine();
Log.w(TAG, "says 2ndTime Server = " + textInNow);
} catch (UnknownHostException e) {
Log.e(TAG, "at thread unknownHost " + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "at thread IO " + e.getMessage());
e.printStackTrace();
}
finally{
Log.i(TAG, "finally");
if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
Log.e(TAG, "at thread dataoutput IO " + e.getMessage());
e.printStackTrace();
}
}
if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
Log.e(TAG, "at thread datainput IO " + e.getMessage());
e.printStackTrace();
}
}
if (socket != null){
try {
Log.i(TAG, "socket closed");
socket.close();
} catch (IOException e) {
Log.e(TAG, "at thread finally IO " + e.getMessage());
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
//displayProgressBar("Downloading...");
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
//updateProgressBar(values[0]);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
コール:
SocketConnect("100.100.100.100","some string");
"100.100.100.100" は、サーバーのIPです。
注:マニフェストファイルのインターネット使用のアクセス許可を設定することを忘れないでください。 注2:Logコールとほとんどのチェックと、3つの最終的なオーバーライドを安全に除去できますすべてがそこにあるので、それは簡単になります、場合によっては、上に構築する)。
は、froyo、gingerbread、icsおよびjbでテストされています。
トラフィックがなくなると一定期間後にバックグラウンドを停止するようにタイマーを設定することができました。 –
これは最善の解決策であるようです。助けてくれてありがとう! –