更新:我找到了我的"两次"问题原因。我启动了两次"runAlarm(("。所以下面的代码工作正常。它定期发送异步 HTTP 请求。您应该添加以下行:
<receiver android:process=":remote" android:name="Alarm"></receiver>
原始问题:我定期使用AlarmManager执行HTTP请求。它在循环中工作正常。但是每个 HTTP 请求执行两次。我使用了一些AlarmManager示例,但不了解那里的"bla-bla"是什么意思。如果你问我为什么不使用计时器,我的答案是,尝试从计时器线程中触摸视图以显示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;
}
public class HttpRequestAlarm extends BroadcastReceiver {
private static final int REQUEST_CODE = 0;
private static final String TAG_CLASS_NAME = HttpRequestAlarm.class
.getName();
private Context context;
private int timeInterval;
public HttpRequestAlarm() {
}
public HttpRequestAlarm(Context context, int timeInterval) {
this.context = context;
this.timeInterval = timeInterval;
}
@Override
public void onReceive(Context context, Intent intent) {
asyncPostRequest();
}
public void start() {
Intent intentAlarm = new Intent(context, HttpRequestAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
REQUEST_CODE, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), timeInterval * 1000, pendingIntent);
Log.i(TAG_CLASS_NAME, "Alarm scheduled for every " + timeInterval
+ " seconds");
}
public void stop() {
Intent intentAlarm = new Intent(context, HttpRequestAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
REQUEST_CODE, intentAlarm, 0);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
Log.i(TAG_CLASS_NAME, "Alarm stopped");
}
}
在项目的清单中仅注册一次接收器.xml如下所示
<receiver android:name="<your.package.name.>HttpRequestAlarm" />
最后创建一个 HttpRequestAlarm 的对象和调用启动方法。这将安排您的警报在每个提供的时间间隔后重复触发。
注意:如果您想在设备处于alseep状态时执行http调用,则必须在http调用之前获取唤醒锁,并在调用完成后释放它。