私は Android でアプリケーションを作成しています。ユーザーが新しいテキスト メッセージ (SMS) を受信するたびに最初にサーバーに送信され、サーバーが true と応答した場合はブロードキャストが中止され、それ以外の場合はブロードキャストします。
問題は、UI スレッドでサーバーと通信できないことです。この問題を克服するには、ある種のスレッドを使用してバックグラウンド操作を実行する必要があるため、AsyncTask を使用してサーバーと通信しています。これが私のコードです:
Android アプリ:
public class IncomingSms extends BroadcastReceiver {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
public static String message;
public void onReceive(final Context context, Intent intent) {
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
String senderNum;
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage
.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage
.getDisplayOriginatingAddress();
senderNum = phoneNumber;
message = currentMessage.getDisplayMessageBody();
CallServer callServer = new CallServer();
callServer.execute();
Log.d("textmsg", callServer.getStatus().toString());
/*
while (callServer.getStatus().toString() == "RUNNING") {
//Log.d("textmsg", "working in loop"); }
*/
if(callServer.get() == "true")
abortBroadcast();
Log.d("textmsg", callServer.getStatus().toString() + "done");
// Show Alert
Toast toast = Toast.makeText(context, "senderNum: "
+ senderNum + ", message: " + message,
Toast.LENGTH_LONG);
toast.show();
} // end for loop
} // bundle is null
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" + e);
}
}
private class CallServer extends AsyncTask<String, String, String> {
@SuppressLint("NewApi")
protected String doInBackground(String... arg0) {
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket("192.168.1.100", 8081);
Log.d("textmsg", "connected");
dataOutputStream = new DataOutputStream(
socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
if (!message.isEmpty()) {
dataOutputStream.writeBytes(message);
return (dataInputStream.readBoolean() == true) ? "true"
: "false";
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
Log.e("error", e.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("error", e.toString());
}
return "false";
}
@Override protected void onPostExecute(String result){
Log.d("textmsg", result);
}
}
}
私が理解できない問題は、サーバーの応答を待つ必要があるため、使用callServer.get()
またはアプリケーションがクラッシュするたびにこれを行っているため、サーバーが true と応答した場合、ブロードキャストを中止できることです。while (callServer.getStatus().toString() == "RUNNING"){}
i.e: true or false
LogCat:
D/textmsg(29494): RUNNING
D/textmsg(29494): connected
I/dalvikvm(29399): threadid=3: reacting to signal 3
I/dalvikvm(29494): Wrote stack traces to '/data/anr/traces.txt'
注: アプリケーションがサーバーでリクエストを送信したときにメッセージを受信するため、サーバー側のコードは完全に機能しています。また、単純なクライアント サーバー アプリケーションを作成して、サーバー側のコードをテストしました。サーバーはローカル マシンで実行されているため、ネットワークの問題はありません。
FutureTask も試しましたが、同じ問題に直面していました。どんな助けでも大歓迎です。