使用WorkManager的定期工作请求不起作用

时间:2018-06-30 18:46:29

标签: android android-workmanager periodicity

我正在尝试编写定期的workmanager脚本,但是它只在我打开应用程序时才运行,并且只运行了一次(不是定期的)!

这是我的主要活动:

library(tidyverse)
library(rvest)

# read the html
html <- read_html('http://www.eliteprospects.com/iframe_player_stats.php?player=364033')

# function to read columns
read_col <- function(x){
  col <- html %>%  
    # CSS nodes to select by using selector gadget
    html_nodes(paste0("td:nth-child(", x, ")")) %>% 
    html_text()
  return(col)
}

# apply the function
col_list <- lapply(c(1:8, 10:15), read_col)

# collapse into matrix
mat <- do.call(cbind, col_list)

# put data into dataframe
df <- data.frame(mat[2:nrow(mat), ] %>% data.frame()) 

# assign names
names(df) <- mat[1, ] 

df

}

这是我的工作方法:

public class MainActivity extends AppCompatActivity {

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

    Intent intent = new Intent();
    PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
    NotifyWorker.pendingIntent = pendingIntent;
    NotifyWorker.context = this;

    PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(NotifyWorker.class, 1, TimeUnit.MINUTES).build();
    WorkManager.getInstance().enqueue(periodicWorkRequest);
}

为什么它不是每1分钟运行一次?我想念什么?

2 个答案:

答案 0 :(得分:17)

根据PeriodicWorkRequest.Builder documentation

  

intervalMillis必须大于或等于PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS

该值当前设置为900000,即15分钟。

答案 1 :(得分:0)

首先,您可以不同意我的回答,但这是我在我的项目中使用的hack,该工作非常准确,没有出现任何问题。 现在该看代码了。我后来指出的一件事,必须在代码之后阅读这一点。 SECTION IMP

//this code in your activity, fragment or any other class
notify_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    OneTimeWorkRequest track_share_market = new OneTimeWorkRequest.Builder(NotificationWorker.class).setInitialDelay(1,TimeUnit.MINUTES).addTag("Stock_Market").build();
                    WorkManager.getInstance().enqueue(track_share_market);
                    Log.d("RishabhNotification","SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSs");
                }
                else {
                    Log.d("RishabhNotification","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
                    WorkManager.getInstance().cancelAllWorkByTag("Stock_Market");
                }
            }
        });

现在输入您的Worker课程代码

public class NotificationWorker extends Worker {

    public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        try {
         //Some heavy operation as you want there is no need to make another thread here 
          //track some website for weather changes or stock market changes
         //In my case doWork takes only 10sec for executing this method  

            ShowNotification("Market Up","Gold Price goes upto ₹25,000 ","Check the app for the new update");
            StartNewRequest();
            return Result.success();

        } catch (Exception e) {
            e.printStackTrace();
            StartNewRequest();
            Log.d("RishabhNotification","ERERERERERERERERERERERERERERERERERERERERERERERERERERERE");
            return Result.failure();
        }
    }

 private void StartNewRequest()
    {
        OneTimeWorkRequest track_market = new OneTimeWorkRequest.Builder(NotificationWorker.class).setInitialDelay(1,TimeUnit.MINUTES).addTag("Stock_Market").build();
        WorkManager.getInstance().enqueue(track_market);
    }

    private void ShowNotification(String Message, String name, String Information)
    {
        NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
        String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Stock Market", NotificationManager.IMPORTANCE_HIGH);

            // Configure the notification channel.
            notificationChannel.setDescription("Channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.GREEN);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableVibration(true);
            notificationChannel.setSound(null,null );
            notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
            notificationManager.createNotificationChannel(notificationChannel);
        }


        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), NOTIFICATION_CHANNEL_ID);

        Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        notificationBuilder.setAutoCancel(false)
                .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE|Notification.DEFAULT_LIGHTS)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setSound(uri)
                .setVisibility(Notification.VISIBILITY_PUBLIC)
                .setPriority(Notification.PRIORITY_MAX)
                .setContentTitle(Message)
                .setContentText(name)
                .setContentInfo(Information);

        notificationManager.notify(/*notification id*/1, notificationBuilder.build());
    }
}

现在阅读 SECTION IMP 该代码可以完美地在模拟器,Pixel手机,三星手机,Moto手机,华硕手机,One Plus手机中正常运行,但是我在Xioami设备和华为设备中测试的同一代码,它们都不在每个特定的时间间隔运行代码(它们都运行代码,但时间可能会更改),这是我在代码中定义的。我不知道为什么这两种设备都会发生这种情况。也许有些优化。检查此链接以了解更多https://www.reddit.com/r/androiddev/comments/9ra0iq/workmanager_reliability_for_periodic_tasks_on/ 我尚未在体内和Oppo设备上测试过此代码。