首页 \ 问答 \ RxJava BackPressureStrategy.DROP排队新任务,而不是放弃它们(RxJava BackPressureStrategy.DROP queues new tasks instead of dropping them)

RxJava BackPressureStrategy.DROP排队新任务,而不是放弃它们(RxJava BackPressureStrategy.DROP queues new tasks instead of dropping them)

我的Android活动中有以下代码,可以按预期工作。 在滚动事件中,它通过带有SynchronousQueueDiscardPolicyThreadPoolExecutor调用expensiveHttpCall() ,这会在最后一次调用仍在运行时丢弃新的调用。

class MyActivity : AppCompatActivity() {

    val recyclerView: RecyclerView
.
    val oneAtATimeExecutor = ThreadPoolExecutor(1, 1, 1L, TimeUnit.SECONDS,
            SynchronousQueue<Runnable>(),
            ThreadPoolExecutor.DiscardPolicy()
    )

    private val scrollListener: RecyclerView.OnScrollListener = object : RecyclerView.OnScrollListener() {
        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            Log.e("rx","triggered!")
            oneAtATimeExecutor.execute { expensiveHttpCall() }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        //...

        recyclerView.addOnScrollListener(scrollListener)

        //...
    }

    private fun expensiveHttpCall() {
        Thread.sleep(2000L)
        Log.e("rx", "done!")
    }
}

我在使用RxJavaPublishProcessor遇到了同样的PublishProcessor

class MyActivity : AppCompatActivity() {

    val recyclerView: RecyclerView

    val processor = PublishProcessor.create<Unit>()

    private val scrollListener: RecyclerView.OnScrollListener = object : RecyclerView.OnScrollListener() {
        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            Log.e("rx","triggered!")
            processor.onNext(Unit)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        //...

        recyclerView.addOnScrollListener(scrollListener)

        //...

        processor.onBackpressureDrop().observeOn(Schedulers.newThread())
                .subscribe { expensiveHttpCall() }
    }

    private fun expensiveHttpCall() {
        Thread.sleep(2000L)
        Log.e("rx", "done!")
    }
}

令人惊讶的滚动后,控制台打印出一堆"triggered"消息。 然后以2秒的连续速率打印"done!" 多达"triggered"打印的次数。 这有效地表现得像一个队列,而不像预期的那样。 我究竟做错了什么?


I have the code below in my Android activity which works as intended. on scroll events it invokes the expensiveHttpCall() through the ThreadPoolExecutor with SynchronousQueue & DiscardPolicy which results on new invokations to be discarded while the last invokation is still running.

class MyActivity : AppCompatActivity() {

    val recyclerView: RecyclerView
.
    val oneAtATimeExecutor = ThreadPoolExecutor(1, 1, 1L, TimeUnit.SECONDS,
            SynchronousQueue<Runnable>(),
            ThreadPoolExecutor.DiscardPolicy()
    )

    private val scrollListener: RecyclerView.OnScrollListener = object : RecyclerView.OnScrollListener() {
        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            Log.e("rx","triggered!")
            oneAtATimeExecutor.execute { expensiveHttpCall() }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        //...

        recyclerView.addOnScrollListener(scrollListener)

        //...
    }

    private fun expensiveHttpCall() {
        Thread.sleep(2000L)
        Log.e("rx", "done!")
    }
}

I'm having trouble implementing the same behavior with RxJava's PublishProcessor:

class MyActivity : AppCompatActivity() {

    val recyclerView: RecyclerView

    val processor = PublishProcessor.create<Unit>()

    private val scrollListener: RecyclerView.OnScrollListener = object : RecyclerView.OnScrollListener() {
        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            Log.e("rx","triggered!")
            processor.onNext(Unit)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        //...

        recyclerView.addOnScrollListener(scrollListener)

        //...

        processor.onBackpressureDrop().observeOn(Schedulers.newThread())
                .subscribe { expensiveHttpCall() }
    }

    private fun expensiveHttpCall() {
        Thread.sleep(2000L)
        Log.e("rx", "done!")
    }
}

To my surprise after a scroll the console prints out a bunch of "triggered" messages. then on a 2 second succession rate it prints "done!" for as many times as the number of "triggered" prints. this effectively behaves like a queue rather than as was intended. what am I doing wrong?


原文:https://stackoverflow.com/questions/50084119
更新时间:2024-02-24 12:02

最满意答案

将清单中的ACTION_POWER_CONNECTED接收器注册为:

<receiver android:name=".OnPowerReceiver">
        <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        </intent-filter>
</receiver>

并在代码部分

public class OnPowerReceiver extends BroadcastReceiver { 

@Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, Your_Activity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);   
    }   
}   

Register an Receiver for ACTION_POWER_CONNECTED in Manifest as:

<receiver android:name=".OnPowerReceiver">
        <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        </intent-filter>
</receiver>

and in Code part

public class OnPowerReceiver extends BroadcastReceiver { 

@Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, Your_Activity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);   
    }   
}   

相关问答

更多

相关文章

更多

最新问答

更多
  • h2元素推动其他h2和div。(h2 element pushing other h2 and div down. two divs, two headers, and they're wrapped within a parent div)
  • 创建一个功能(Create a function)
  • 我投了份简历,是电脑编程方面的学徒,面试时说要培训三个月,前面
  • PDO语句不显示获取的结果(PDOstatement not displaying fetched results)
  • Qt冻结循环的原因?(Qt freezing cause of the loop?)
  • TableView重复youtube-api结果(TableView Repeating youtube-api result)
  • 如何使用自由职业者帐户登录我的php网站?(How can I login into my php website using freelancer account? [closed])
  • SQL Server 2014版本支持的最大数据库数(Maximum number of databases supported by SQL Server 2014 editions)
  • 我如何获得DynamicJasper 3.1.2(或更高版本)的Maven仓库?(How do I get the maven repository for DynamicJasper 3.1.2 (or higher)?)
  • 以编程方式创建UITableView(Creating a UITableView Programmatically)
  • 如何打破按钮上的生命周期循环(How to break do-while loop on button)
  • C#使用EF访问MVC上的部分类的自定义属性(C# access custom attributes of a partial class on MVC with EF)
  • 如何获得facebook app的publish_stream权限?(How to get publish_stream permissions for facebook app?)
  • 如何防止调用冗余函数的postgres视图(how to prevent postgres views calling redundant functions)
  • Sql Server在欧洲获取当前日期时间(Sql Server get current date time in Europe)
  • 设置kotlin扩展名(Setting a kotlin extension)
  • 如何并排放置两个元件?(How to position two elements side by side?)
  • 如何在vim中启用python3?(How to enable python3 in vim?)
  • 在MySQL和/或多列中使用多个表用于Rails应用程序(Using multiple tables in MySQL and/or multiple columns for a Rails application)
  • 如何隐藏谷歌地图上的登录按钮?(How to hide the Sign in button from Google maps?)
  • Mysql左连接旋转90°表(Mysql Left join rotate 90° table)
  • dedecms如何安装?
  • 在哪儿学计算机最好?
  • 学php哪个的书 最好,本人菜鸟
  • 触摸时不要突出显示表格视图行(Do not highlight table view row when touched)
  • 如何覆盖错误堆栈getter(How to override Error stack getter)
  • 带有ImageMagick和许多图像的GIF动画(GIF animation with ImageMagick and many images)
  • USSD INTERFACE - > java web应用程序通信(USSD INTERFACE -> java web app communication)
  • 电脑高中毕业学习去哪里培训
  • 正则表达式验证SMTP响应(Regex to validate SMTP Responses)