1

更新:「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;
    }
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");
    }
}

以下のように、プロジェクトの Manifest.xml にレシーバーを 1 回だけ登録します。

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

最後に HttpRequestAlarm のオブジェクトを作成し、start メソッドを呼び出します。これにより、指定された timeInterval ごとにアラームが繰り返しトリガーされるようにスケジュールされます。

注:デバイスが alseep の場合でも http 呼び出しを実行する場合は、http 呼び出しの前にウェイクロックを取得し、呼び出しが完了したら解放する必要があります。

于 2014-08-15T09:02:11.640 に答える