在android中调度http请求
我的应用程序的第一步是工作:当点击一个按钮时,它发出一个http请求,对结果进行JSON解析,并显示和存储数据。我现在希望能够安排活动,以便同样的事情在后台定期发生——但我无法让它正常工作。 我已经看了一些关于创建广播接收器和警报的教程 (及 ) 并在一个单独的应用程序中复制了一个只产生 计划事件发生时的toast消息。 但当我尝试将这两件事结合起来时(安排一个活动以使 http请求)复杂性让我无法忍受。如果有人能给我一些指导的话 我将不胜感激 第一步(可行的)是单击按钮,运行一个只有两行的方法在android中调度http请求,android,android-intent,Android,Android Intent,我的应用程序的第一步是工作:当点击一个按钮时,它发出一个http请求,对结果进行JSON解析,并显示和存储数据。我现在希望能够安排活动,以便同样的事情在后台定期发生——但我无法让它正常工作。 我已经看了一些关于创建广播接收器和警报的教程 (及 ) 并在一个单独的应用程序中复制了一个只产生 计划事件发生时的toast消息。 但当我尝试将这两件事结合起来时(安排一个活动以使 http请求)复杂性让我无法忍受。如果有人能给我一些指导的话 我将不胜感激 第一步(可行的)是单击按钮,运行一个只有两行的方法
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;
}
}
我有这个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);
}
}
感谢您的帮助。当发送广播意图时,可以运行广播接收器。可以通过报警服务执行此操作,但不是必需的。报警服务可以发送您想要的任何意图。这个意图可以启动一个活动或服务(这可能是您所需要的,因为您希望它在后台发生) 似乎您正在发送启动广播接收器的意图,就像启动活动或服务一样。据我所知,这不是使用广播接收器的正确方法
将AlarmReceiver更改为服务(并实施所需的服务方法),您应该可以。您是否考虑过将其作为一个服务运行,下面是一个相当全面的示例:谢谢selalerer。因此,您是说报警服务应该发送一个意图,该意图应该启动一个服务,并且报警接收器应该更改为该服务。是吗?我想这样就行了。您可能会发现这很有用:我现在让它作为一个服务工作,只是在计划的时间显示一条toast消息,但我还不能执行我想要的任务(运行AsyncNetworkConnection)。我最初为响应按钮单击而执行http请求的编码将AsyncNetworkConnection(扩展AsyncTask)作为一个内联类。我的报警服务现在工作正常,但我无法让它运行内联类,而且我无法将AsyncNetworkConnection重新创建为普通(非内联)类。关于如何做到这一点有什么建议吗?我还没有让它起作用,但这已经向我展示了部分方法,所以我把它标记为答案。谢谢selalerer。
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);
}
}