1

我的应用程序的第一步正在运行:当单击按钮时,它会发出一个 http 请求,对结果进行 JSON 解析并显示和存储数据。我现在希望能够安排事件,以便在后台定期发生同样的事情 - 我无法让它工作。我看过一些关于创建广播​​接收器和警报的教程(http://justcallmebrian.com/?p=129http://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);
    }
}

任何帮助表示赞赏。

4

1 回答 1

0

发送广播意图时可以运行广播接收器。可以使用警报服务执行此操作,但不是必需的。警报服务可以发送您想要的任何意图。这个意图可以启动一个活动或服务(这可能是你需要的,因为你希望它在后台发生)。

似乎您正在发送启动广播接收器的意图,就像您启动活动或服务一样。据我所知,这不是使用广播接收器的正确方法。

将您的 AlarmReceiver 更改为服务(并实现所需的服务方法),您应该没问题。

于 2013-05-03T15:05:05.883 回答