1

私のアプリの最初のステップは機能しています。ボタンをクリックすると、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);
    }
}

どんな助けでも感謝します。

4

1 に答える 1