更新:我找到了我的“两次”问题原因。我启动了两次“runAlarm()”。所以下面的代码可以正常工作。它定期发送异步 HTTP 请求。您应该添加到清单这一行:
<receiver android:process=":remote" android:name="Alarm"></receiver>
原始问题:我使用 AlarmManager 定期发出 HTTP 请求。它在循环中工作正常。但是每个 HTTP 请求都会执行两次。我使用了一些 AlarmManager 示例,但不理解那里的“bla-bla”是什么意思。如果你问我为什么不使用 Timer,我的回答是我在尝试从计时器线程中触摸 Views 以显示 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;
}