2013-05-03 64 views
1

我的應用程序的第一步工作是:當單擊一個按鈕時,它發出一個http請求,執行結果的JSON分析並顯示和存儲數據。我現在希望能夠安排事件,以便在背景中定期發生同樣的事情 - 而且我無法實現。 我已經看了幾個教程創建broadcastreceivers和報警 (http://justcallmebrian.com/?p=129http://mobile.tutsplus.com/tutorials/android/android-fundamentals-scheduling-recurring-tasks/) 和一個單獨的應用程序複製了簡單的版本,當預定事件發生時,僅僅產生 敬酒消息。 但是,當我嘗試合併這兩件事(安排一個事件來製作 http請求),複雜性正在擊敗我。如果有人可以給我一些指導 我會很感激。在android中安排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請求,然後嘗試將其簡化爲僅顯示Toast消息 - 兩者都不起作用。

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

任何幫助表示讚賞。

+0

你有沒有考慮過運行這個[service](http://developer.android.com/reference/android/app/Service.html),這裏有一個相當全面的例子:http://www.vogella.com/文章/ AndroidServices/article.html – HeatfanJohn 2013-05-03 14:59:41

回答

0

廣播接收器可以在廣播意圖發送時運行。可以通過報警服務來做到這一點,但不是必要的。警報服務可以發送您想要的任何意向。這個意圖可以啓動一項活動或一項服務(這可能是你需要的,因爲你希望它發生在後臺)。

看起來你正在發送一個意圖,像啓動一個活動或服務一樣啓動一個廣播接收器。據我所知,這不是使用廣播接收機的正確方法。

更改您的AlarmReceiver是一項服務(並實施所需的服務方法),您應該沒問題。

+0

謝謝selalerer。所以你說警報服務應該發送一個意圖,它應該啓動一個服務,並且警報接收器應該改變爲該服務。是對的嗎? – 2013-05-03 15:30:31

+0

我認爲這樣做。您可能會發現這有用:http://stackoverflow.com/questions/8321443/how-to-start-service-using-alarm-manager-in-android – selalerer 2013-05-03 15:38:23

+0

我現在有它作爲服務工作,只是顯示吐司消息在預定的時間,但我還沒有能夠我想要的任務(運行AsyncNetworkConnection)。 – 2013-05-04 08:18:30