为什么 AlarmManager 执行两次异步 Http 请求



更新:我找到了我的"两次"问题原因。我启动了两次"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调用之前获取唤醒锁,并在调用完成后释放它。

最新更新