在android中调度http请求

在android中调度http请求,android,android-intent,Android,Android Intent,我的应用程序的第一步是工作:当点击一个按钮时,它发出一个http请求,对结果进行JSON解析,并显示和存储数据。我现在希望能够安排活动,以便同样的事情在后台定期发生——但我无法让它正常工作。 我已经看了一些关于创建广播接收器和警报的教程 (及 ) 并在一个单独的应用程序中复制了一个只产生 计划事件发生时的toast消息。 但当我尝试将这两件事结合起来时(安排一个活动以使 http请求)复杂性让我无法忍受。如果有人能给我一些指导的话 我将不胜感激 第一步(可行的)是单击按钮,运行一个只有两行的方法

我的应用程序的第一步是工作:当点击一个按钮时,它发出一个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);
    }
}