【问题标题】:How to update a component using AlarmManager?如何使用 AlarmManager 更新组件?
【发布时间】:2015-07-19 01:48:35
【问题描述】:

我正在一个应用程序中工作,该应用程序需要每 5 秒执行一次后台作业以从服务器检索图像,当该作业完成后,如果有内容,我的 UI 中的 ImageView 需要更新返回。 我正在使用AlarmManager 来完成这项工作,但不知道在完成工作后如何更新 UI。 另外我想知道这是否是最好的方法,或者我是否必须实施某种服务。

这是我的onCreate 方法,我用PendingIntent 初始化我的UI 组件和AlarmManager

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    swtSIGNAL = (Switch) findViewById(R.id.swtSIGNAL);
    snackView = swtSIGNAL;
    swtSIGNAL.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (!isChecked) {
                mSetSignalTask = new SetSignalAsync(progressDialog, snackView, true);
                mSetSignalTask.execute();
            } else {
                mSetSignalTask = new SetSignalAsync(progressDialog, snackView, false);
                mSetSignalTask.execute();
            }
        }
    });

    swtALARM=(Switch)findViewById(R.id.swtALARM);
    snackView=swtALARM;
    swtALARM.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (!isChecked) {
                mSetAlarmTask = new SetAlarmAsync(progressDialog, snackView,true);
                mSetAlarmTask.execute();
            } else {
                mSetAlarmTask = new SetAlarmAsync(progressDialog,snackView,false);
                mSetAlarmTask.execute();
            }
        }
    });

    imgFOTO=(ImageView) findViewById(R.id.imgFOTO);

    progressDialog = new ProgressDialog(this);
    progressDialog.setCancelable(false);
    progressDialog.isIndeterminate();

    callListener = new EndCallListener();
    telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    telephonyManager.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);

    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
}

这是我的setAlarm 方法,它激活了AlarmManager:

public void setAlarm(){
    manager=(AlarmManager)getSystemService(ALARM_SERVICE);
    int interval=5000;

    manager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),interval,pendingIntent);
    Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show();
}

这是从BroadcastReceiver 扩展而来的AlarmReceiver 类:

public class AlarmReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Working", Toast.LENGTH_SHORT).show();
    }
}

最后这是从服务器获取图像的方法;我使用AsyncTask 来不冻结应用程序。

public class GetImageAsync extends AsyncTask<Void,Void,Bitmap>{

    @Override
    protected Bitmap doInBackground(Void... params) {
        try{
                URL url=new URL("http://192.168.0.16/HouseSecure/SECImages/example.jpg");
                HttpURLConnection connection=(HttpURLConnection)url.openConnection();
                connection.setDoInput(true);
                connection.connect();
                InputStream inputStream=connection.getInputStream();
                Bitmap image= BitmapFactory.decodeStream(inputStream);
                connection.disconnect();
                return image;
        }catch (MalformedURLException e){
            Log.e(LOG_TAG, e.getMessage());
            return null;
        }catch(IOException ex){
            Log.e(LOG_TAG,ex.getMessage());
            return null;
        }
    }

    @Override
    protected void onPostExecute(Bitmap image) {
        imgFOTO.setImageBitmap(image);
    }
}

【问题讨论】:

  • 是您的 AlarmReceiver 启动了 GetImageAsync 任务吗?您是否只是忘记在上面的 AlarmReceiver 类中包含该行?

标签: java android web-services android-asynctask alarmmanager


【解决方案1】:

如果要设置闹钟,请使用 Studio 提供的 AlarmClock API,而不是 AlarmManager

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2015-05-18
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多