RxJava BackPressureStrategy.DROP排队新任务,而不是放弃它们(RxJava BackPressureStrategy.DROP queues new tasks instead of dropping them)
我的Android活动中有以下代码,可以按预期工作。 在滚动事件中,它通过带有
SynchronousQueue
&DiscardPolicy
的ThreadPoolExecutor
调用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!") } }
我在使用
RxJava
的PublishProcessor
遇到了同样的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 theThreadPoolExecutor
withSynchronousQueue
&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
'sPublishProcessor
: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
最满意答案
将清单中的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); } }
相关问答
更多-
在开始之前,请确保您的手机设置中的USB DEBUGGING已启用 ! 1)BASIC STEP - 通过USB插入设备,然后转到Android开发者博客中的设备页面 。 在那里,您可以找到有关添加USB供应商标识的必要信息。 添加您的设备特定的ID,如果需要,重新启动eclipse。 2)如果您能够早日看到设备连接(使用命令: 'adb devices' ),但是不要再尝试重新启动ADB。 (您可以使用以下命令: 'adb kill-server'后跟'adb start-server' 。如果没有导出, ...
-
我很确定,为了开发这个我需要使用ExternalAccessory.Framework。 你错了。 ExternalAccessory框架只能用于与支持MFi的附件设备和使用Apple支持开发的蓝牙设备进行通信。 iPhone USB线(和电脑)不是这样的设备; 你不能在这里使用这个框架。 如果您需要在iOS应用程序和计算机之间传输小文件,最合适的方法是启用文件共享。 这将导致您的应用程序出现在iTunes中以进行文件传输。 有关详细信息,请参阅如何为我的应用启用文件共享的问题? I am quite su ...
-
Android客户端应用程序(可能通过USB使用ADB)(Android Client Application (Possibly using ADB through USB))[2022-07-11]
如果您想将计算机上的TCP端口8001转发到手机上的端口8001,则可以使用以下命令: adb forward tcp:8001 tcp:8001 如果需要,您可以更改手机或设备上的端口。 该命令的文档位于以下位置: http : //developer.android.com/guide/developing/tools/adb.html#forwardports 至于为什么这不应该工作 - 有一些信息从你的问题中遗漏。 这些只是标准的TCP套接字。 Java版本不应该有任何区别,所以我不明白你的问题。 ... -
我头脑中的一些想法: 如果您的手机可以访问互联网并且您可以访问您的网络路由器(或者您可以让管理员为您执行此操作),那么您只需将端口转发到PC并通过适当的端口从Internet连接到路由器。 请查看您的路由器手册以获取更多详细信息 您还可以购买便宜的usb wifi密钥,您可以将其与PC一起使用,以便与手机建立直接连接 根据您的手机操作系统,您实际上可以通过使用第三方软件和一些黑客来共享互联网连接(因此可能同时让您的手机访问您的本地PC) - 这是Android的一个但需要root操作系统http:// ww ...
-
经过研究,我发现键盘接口类型的USB RFID读取器在连接到Android OS时将作为键盘输入接口设备工作,因此无法使用API读取。 (这就是RFID制造商如何设计这种类型的读卡器) 但是有Read的Read&Write类型,可以使用API进行读写。 读卡器制造必须提供API工具包才能从Reader读取/写入数据。 Thanks for the input. I was trying to solve this problem from past few days. I solved the proble ...
-
连接USB电缆后自动启动我的android应用程序。(Starting my android application automatically after connecting the USB cable.)[2021-07-30]
将清单中的ACTION_POWER_CONNECTED接收器注册为: -
建立您的.apk 将.apk下载到手机上 运行.apk 您可以使用ES文件资源管理器等应用程序,它允许您访问网络上的共享文件。 Build your .apk Download the .apk to the phone Run the .apk You can use an app like ES File Explorer, which allow you to access shared files on your network.
-
尝试不同的电缆或不同的端口。 我的设备在某些USB充电器上遇到了这种麻烦,我被告知这是因为接地或类似的电器。 从来没有遇到任何有线电脑的问题。 try a different cable or a different port. I've had this kind of trouble with my device on certain USB chargers and I've been told it's because of grounding or something electrical lik ...
-
你应该使用adb over TCP,Android开发者网站在调试注意事项(页面底部)下有一篇简短的文章。 You should use adb over TCP, the Android developer site has a short article here under Debugging considerations (bottom of the page).
-
Android应用程序通过USB电缆的数据引脚发送信号(android app to send a signal through the data pin of the usb cable)[2024-01-04]
与一些较旧的端口设计(串行和并行端口)不同,USB不提供任何任意电气控制。 每个引脚都支持USB协议中的特定功能,不能任意设置。 某些设备可能支持切换到备用非USB模式,但几乎所有这些模式同样不允许直接控制。 如果您的Android手机支持USB主机模式,则可以连接USB串行(RS232)适配器。 它有两个可任意设置的控制引脚,RTS和DTR,以及实际的串行数据线。 Unlike some older port designs (serial and parallel ports), USB does no ...