私のアプリの最初のステップは機能しています。ボタンをクリックすると、http リクエストが作成され、結果の JSON 解析が行われ、データが表示および保存されます。バックグラウンドで同じことが定期的に発生するように、イベントをスケジュールできるようにしたいと考えていますが、うまくいきません。ブロードキャストレシーバーとアラームの作成に関するいくつかのチュートリアルを見てきました ( http://justcallmebrian.com/?p=129および http://mobile.tutsplus.com/tutorials/android/android-fundamentals-scheduling-recurring-タスク/)、別のアプリで、スケジュールされたイベントが発生したときにトースト メッセージを生成するだけの単純なバージョンを複製しました。しかし、2 つのことを組み合わせようとすると (イベントをスケジュールして http 要求を作成する)、複雑さが私を打ち負かしています。誰かが私にいくつかのガイダンスを与えることができれば、私はそれを感謝します.
最初のステップ (動作) は、わずか 2 行のメソッドを実行するボタンのクリックから始まります。
urlStr = "http://data_service_site?parm=1";
new AsyncNetworkConnection().execute(urlStr);
メイン アクティビティには、このインライン クラスがあります。
class AsyncNetworkConnection extends AsyncTask<String, String, String>
{
@Override
protected void onPostExecute(String result) {
//working JSON code here
//working code to display & store data here
}
@Override
protected String doInBackground(String... arg0) {
String results = null;
try {
results = fetchHTML(arg0[0]);
} catch (ClientProtocolException e) {
String msg = getResources().getString(R.string.str_html_error, e.getMessage());
Log.e(TAG, "Http error", e);
} catch (Exception e) {
String msg = getResources().getString(R.string.str_html_error, e.getMessage());
Log.e(TAG, "Http connection error", e);
}
return results;
}
private String fetchHTML(String urlStr) throws URISyntaxException, ClientProtocolException, IOException, Exception
{
DefaultHttpClient httpclient = null;
URI serviceUri = new URI(urlStr);
String result;
try {
HttpGet getRequest = new HttpGet(serviceUri);
ResponseHandler<String> handler = new BasicResponseHandler();
httpclient = new DefaultHttpClient();
result = httpclient.execute(getRequest, handler);
Log.i(TAG, "Put to Service. Result: " + result);
} catch (Exception e) {
throw e;
} finally {
if(null != httpclient){
httpclient.getConnectionManager().shutdown();
}
}
return result;
}
}
上記の作品; 次はそうではありません。同じタスクをスケジュールする簡単な方法を試すために、この方法を実行する別のボタンを追加しました。
public void setOneOffAlarm(View v) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, 2);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
}
そして、私はこのalarmreceiverクラスを持っています。別のクラス ファイルとして作成する際に問題があったため、同じアクティビティでインライン クラスとして使用しました。最初に http リクエストを実行しようとした後、単純化してトースト メッセージを表示するようにしましたが、どちらも機能しませんでした。
public class AlarmReceiver extends BroadcastReceiver {
private static final String DEBUG_TAG = "AlarmReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Intent downloader = new Intent(context, AsyncNetworkConnection.class);
//downloader.setData(Uri
//.parse("http://data_service_site?parm=1"));
//Try just showing toast:
String message = ("alarm_message");
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
context.startService(downloader);
}
}
どんな助けでも感謝します。