1

更新:我找到了我的“两次”问题原因。我启动了两次“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;
    }
4

1 回答 1

1
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");
    }
}

Register receiver only once in your project's Manifest.xml as below

    <receiver android:name="<your.package.name.>HttpRequestAlarm" />

And finally create an object of HttpRequestAlarm and call start method. This will schedule your alarm to trigger repeatedly after every provided timeInterval.

Note: If you want to execute your http call even when your device is alseep then you will have to acquire wakelock before http call and release it once call completes.

于 2014-08-15T09:02:11.640 回答