更新:「2回」の問題の理由が見つかりました。「runAlarm()」を 2 回起動しました。したがって、以下のコードは問題なく動作します。Async HTTP リクエストを定期的に送信します。次の行をマニフェストに追加する必要があります。
<receiver android:process=":remote" android:name="Alarm"></receiver>
元の質問: AlarmManager を使用して定期的に HTTP リクエストを行いました。ループで問題なく動作します。ただし、各 HTTP 要求は 2 回実行されます。「bla-bla」の意味を理解せずに、AlarmManagerの例をいくつか使用しました。タイマーを使用しない理由を尋ねられた場合、HTTP 要求の結果を表示するためにタイマー スレッドからビューにアクセスしようとするとエラーが発生するというのが私の答えです。私のコードは以下です。前もって感謝します!。
private void startHttpRequests() {
setAlarm();
}
public void setAlarm()
{
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override public void onReceive( Context context, Intent _ )
{
asyncPostRequest();
context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
}
};
this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );
PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("com.blah.blah.somemessage"), 0 );
AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));
pollPeriod=1000*10;
manager.set( AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + pollPeriod, pintent );
}
private void asyncPostRequest() {
new HttpPostDemo().execute("http://www.google.com");
}
@Override
protected void onPostExecute(String result) //HTTP POST result
{
printDebug("received="+result);
setAlarm();
}
public class HttpPostDemo extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... urls)
{
BufferedReader inBuffer = null;
String url= urls[0];
String result = "fail";
try {
HttpClient httpClient = new DefaultHttpClient();
HttpPost request = new HttpPost(url);
List<NameValuePair> postParameters =
new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("operanda", "5"));
postParameters.add(new BasicNameValuePair("operandb", "6"));
postParameters.add(new BasicNameValuePair("answer", "11"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(
postParameters);
request.setEntity(formEntity);
HttpResponse httpResponse = httpClient.execute(request);
inBuffer = new BufferedReader(
new InputStreamReader(
httpResponse.getEntity().getContent()));
StringBuffer stringBuffer = new StringBuffer("");
String line = "";
String newLine = System.getProperty("line.separator");
while ((line = inBuffer.readLine()) != null) {
stringBuffer.append(line + newLine);
}
inBuffer.close();
result = stringBuffer.toString();
} catch(Exception e) {
// Do something about exceptions
result = e.getMessage();
} finally {
if (inBuffer != null) {
try {
inBuffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}