我的应用程序的第一步正在运行:当单击按钮时,它会发出一个 http 请求,对结果进行 JSON 解析并显示和存储数据。我现在希望能够安排事件,以便在后台定期发生同样的事情 - 我无法让它工作。我看过一些关于创建广播接收器和警报的教程(http://justcallmebrian.com/?p=129和 http://mobile.tutsplus.com/tutorials/android/android-fundamentals-scheduling-recurring-任务/) 并在单独的应用程序中复制了简单版本,该版本仅在预定事件发生时生成 toast 消息。但是当我尝试将这两件事结合起来(安排一个事件来发出 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);
}
}
任何帮助表示赞赏。