当前位置: 首页 > 知识库问答 >
问题:

Android后台进程每分钟从网页加载数据

薛枫
2023-03-14

我正在开发一个Android应用程序,有一个不断重复的后台进程。

从设备启动的那一刻起,它应该每分钟加载一个网页上的数据。它使用XmlPullParser和一个简单的URL InputStream。它只有10KB,所以没有那么密集。我相信这种任务叫做延期。一旦用户打开应用程序,流程加载的信息必须可以访问活动。后台进程也需要设置,以便在数据显示某些结果时发出通知。

在Android中似乎有多种方法来实现这一点,例如。然而,JobScheduler、WorkManager或AlarmManager,到目前为止我所尝试的一切似乎要么在活动关闭后停止,要么根本不运行。时间,每分钟,似乎也是一个问题,因为重复的工作和工人的最小间隔是15。这一分钟不一定要精确。我认为,与其让一个重复的进程加载数据,不如让一个长时间运行的进程在加载数据之间Hibernate1m。

共有1个答案

西门嘉石
2023-03-14

使用workmanager很容易,这是在Android中安排重复后台工作的最受欢迎的方式,请参见导言。

正如你所说,重复工作请求的最小间隔被限制在15分钟内,打破这一间隔的唯一方法是重复安排一次性工作。

1.设置员工类:

class ToastShower(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {
    override suspend fun doWork(): Result {
        withContext(Dispatchers.Main) {      //ui related work must run in Main thread!!
            Toast.makeText(applicationContext, "Hey, I'm Sam! This message will appear every 5 seconds.", Toast.LENGTH_SHORT).show()
        }

        return Result.success()
    }
}
class WorkManagerApplication : Application() {
    private val backgroundScope = CoroutineScope(Dispatchers.Default)       //standard background thread
    private val applicationContext = this

    override fun onCreate() {                           //called when the app launches (same as Activity)
        super.onCreate()

        initWork()
    }

    private fun initWork() {
        backgroundScope.launch {                                //all rnu in background thread
            setupToastShowingWork(0)                            //no delay at first time

            observeToastShowingWork()                       //observe work state changes, see below
        }
    }

    private fun setupToastShowingWork(delayInSeconds: Long) {               //must run in background thread
        val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.UNMETERED)          //when using WiFi
            .build()

        val oneTimeRequest = OneTimeWorkRequestBuilder<ToastShower>()       //【for breaking 15 minutes limit we have to use one time request】
            .setInitialDelay(delayInSeconds, TimeUnit.SECONDS)          //customizable delay (interval) time
            .setConstraints(constraints)
            .build()

        WorkManager.getInstance(applicationContext).enqueueUniqueWork(      //【must be unique!!】
            ToastShower::class.java.simpleName,                 //work name, use class name for convenient
            ExistingWorkPolicy.KEEP,                        //if new work comes in with same name, discard the new one
            oneTimeRequest
        )
    }

    private suspend fun observeToastShowingWork() {
        withContext(Dispatchers.Main) { //must run in Main thread for using observeForever 
            WorkManager.getInstance(applicationContext).getWorkInfosForUniqueWorkLiveData(ToastShower::class.java.simpleName).observeForever {
                if (it[0].state == WorkInfo.State.SUCCEEDED) {          //when the work is done
                    backgroundScope.launch {                        //prevent from running in Main thread
                        setupToastShowingWork(5)                        //every 5 seconds
                    }
                }
            }
        }
    }
}
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.workmanagertest">

    <application
        android:name=".WorkManagerApplication"                  //【here, must!!!】
    
        ...

    </application>

</manifest>
 类似资料:
  • 我正在尝试执行某些操作,例如创建一个表,并在应用程序的初始启动时插入720行,这需要一些时间,所以我决定在后台运行它。请参见下面的代码, 主要活动。Java语言 当我运行它时,它显示logcat中的以下错误, 请帮忙! 仅供参考:整个Logcat

  • 我试着在网络视图中查看http://artikelweb.com。网页显示得很好。但是,每当我从“热门作者”部分转到任何作者链接时,网页都会出现,但是加载后,报价没有显示。 在Google Chrome浏览器(移动)中,加载后会出现引号, 但是,在我的应用程序中,引用不会显示在网络视图中。 代码片段:

  • 我最初的fxml(例如)有很多功能,因此完全加载需要大量时间。因此,为了避免程序启动和fxml加载之间的时间间隔,我引入了另外一个fxml()和一个gif图像,该图像应该在加载主fxml时出现。问题是我的加载器中的gif图像。fxml不会移动,就像程序中的挂起一样,直到home.fxml被完全加载。为了避免这种情况,我将home.fxml加载移到一个线程中,如下代码所示。 但是在这段代码之后,我的

  • 我正在努力实施这篇文章中给出的建议。 不幸的是,我不清楚步骤。我尝试实施这些建议,但后台时间剩余继续减少,即使我开始和停止位置服务。我是这样开发它的: InitTimer: 检查更新: 有人对我的代码中可能出现的错误有什么建议吗?正在调用initTimer和checkUpdates,但仅在后台执行时间(-10分钟)期间调用。我希望应用程序“永远”每隔n分钟更新一次位置。 我的应用程序的UIBack

  • 我的图像是从网络连接加载的。 我有3个图像,希望在一个ImageView中每2秒更改一次。 例如,图像1 - 当前,我的代码如下:

  • 问题内容: 我编写了一个CMS,其中记录了谁最近登录了系统。目前,此数据通过Ajax馈入jQuery UI选项卡。我想将此信息放入主页的侧边栏中,并每30秒(或一定时间)通过AJAX加载。 我将如何去做?PHP响应是否需要JSON编码?我对AJAX和JSON数据还很陌生。 这是我目前用于从用户表中提取详细信息的PHP- 谢谢! 更新 好的,这就是我到目前为止所拥有的..我所坚持的部分是如何遍历JS