我在远程管理玩具项目中工作.现在,我可以使用Robot该类捕获屏幕截图并控制鼠标.截图是BufferedImage实例.
首先,我的要求: - 只有服务器和客户端. - 性能很重要,因为客户端可能是Android应用程序.
我想过打开两个套接字连接,一个用于鼠标和系统命令,另一个用于视频输入.
如何将屏幕截图转换为视频流?我应该将它们转换为已知的视频格式,还是可以发送一系列序列化图像?
压缩是另一个问题.根据我的初步测试,以全分辨率发送屏幕捕获将导致低帧速率.我认为我需要至少24 fps来感知运动,所以我要同时缩小和压缩.我可以转换BufferedImages为jpg文件,然后设置压缩率,但我不想将文件存储在磁盘上,它们应该只存在于RAM中.另一种可能性是将实例(表示未压缩的屏幕截图)序列化为GZipOutputStream.这是正确的方法是什么?
总结一下:
OutputStream?提前致谢.
更新:我的测试,客户端和服务器在同一台机器上
- 全屏幕序列化BufferedImages(只有维度,类型和int []),没有压缩:1.9 fps.
通过GZip流的完整屏幕图像:2.6 fps.
-Downscaled图像(640宽度)和GZip流:6.56 fps.
- 全屏幕图像和RLE编码:4.14 fps.
-Downscaled图像和RLE编码:7.29 fps.
我正在将一些旧的 RxJava 代码移植到 Coroutines。使用 RxJava,我可以在我的活动中做到这一点:
someBgOperation()
.as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(MyActivity.this)))
.subscribe(
MyActivity.this::onSuccess,
MyActivity.this::onError
);
Run Code Online (Sandbox Code Playgroud)
如果活动正在关闭,自动处理库将取消 Observable。在这种情况下,RxJava 不会调用错误处理程序,因此可以在错误处理程序中安全地执行 UI 相关的操作,例如显示对话框。
现在,在 Kotlin 中,我们可以lifecycleScope在 Activity 中或在viewModelScope使用 ViewModel 的情况下启动此等效代码:
viewModelScope.launch {
try {
someBgOperation()
} catch (e: Exception){
//show dialog
}
}
Run Code Online (Sandbox Code Playgroud)
当活动关闭时,两个作用域都会自动取消,就像 Autodispose 所做的那样。但是 catch 块不仅会执行someBgOperation它自己抛出的正常错误,还会执行CancellationException引擎盖下的协程库用来处理取消的 s。如果我在活动关闭时尝试在那里显示一个对话框,我可能会收到新的异常。所以我被迫做这样的事情:
viewModelScope.launch {
try {
someBgOperation()
} catch (ce: CancellationException){
//do nothing, activity is closing
} catch (e: Exception){
//show dialog
}
}
Run Code Online (Sandbox Code Playgroud)
这感觉比 Rx 版本更冗长,并且它有一个空的 catch 子句,它会在 lint 输出中显示警告。在 try-catch …
在代码中隐藏文字值的主要现有方法是什么,因此只使用hexdumper或反编译器就不能轻易跟踪它们?
例如,而不是编码:
static final int MY_VALUE = 100;
Run Code Online (Sandbox Code Playgroud)
我们可以有:
static final int MY_VALUE = myFunction1();
private int myFunction1(){
int i = 23;
i += 8 << 4;
for(int j = 0; j < 3; j++){
i-= (j<<1);
}
return myFunction2(i);
}
private int myFunction2(int i){
return i + 19;
}
Run Code Online (Sandbox Code Playgroud)
这只是我们要做的事情的一个例子.(是的,我知道,编译器可以优化它并预先计算常量).
免责声明:我知道这根本不会提供任何安全性,但它使代码更加模糊(或有趣)进行逆向工程.这样做的目的只是为了强制攻击者调试程序,并在其上浪费时间.请记住,我们这样做只是为了好玩.
我正在尝试在Java ME中实现一个简单的阻塞队列.在JavaME API中,Java SE的并发实用程序不可用,因此我必须像以前一样使用wait-notify.
这是我的临时实施.我正在使用notify而不是notifyAll因为在我的项目中有多个生产者,但只有一个消费者.我故意使用一个对象进行wait-notify来提高可读性,尽管它浪费了一个引用:
import java.util.Vector;
public class BlockingQueue {
private Vector queue = new Vector();
private Object queueLock = new Object();
public void put(Object o){
synchronized(queueLock){
queue.addElement(o);
queueLock.notify();
}
}
public Object take(){
Object ret = null;
synchronized (queueLock) {
while (queue.isEmpty()){
try {
queueLock.wait();
} catch (InterruptedException e) {}
}
ret = queue.elementAt(0);
queue.removeElementAt(0);
}
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
我的主要问题是关于put方法.我可以把queue.addElement线放出synchronized块吗?如果是这样,性能会改善吗
此外,同样适用于take:我可以采取两种操作queue出来的synchronized block …
我有一个网页(显示在浏览器中,而不是 WebView),我想将一些数据(例如使用 http POST)传递给常规的 android 应用程序。
我只需要启动应用程序并输入数据即可。我知道可以通过注册一个意图过滤器来启动该应用程序,但是我在数据传递部分迷失了方向。
URL 不需要是真实的,虚假的 URL 就可以了。
这可以在 BlackBerry 中使用 HTTP 过滤器完成。有没有办法在Android中做同样的事情?
提前致谢。
我有许多需要完成的异步任务,所以我使用的是promises.
我需要检测每个承诺何时被执行(解决和拒绝).在此之前我不能继续执行.
我使用的是这样的东西:
$.when(promise1, promise2, ...).always();
Run Code Online (Sandbox Code Playgroud)
但是这个代码是错误的,因为该when方法具有惰性求值,并且只要其中一个promise失败就会返回.因此,always只要其中一个承诺失败,回调也会运行.
我想在编码一个解决办法,但这种使用情况是如此普遍,也许有人已经做它已经,或者也许甚至还有这样做只使用jQuery的的一种方式(如果不是,这将是很好添加Promise.whenNonLazy或Promise.when(promise1, promise2, ..., false)在未来.
这可能吗?
java.time.LocalDateTime success = java.time.LocalDateTime.parse("20 01 2014 15 36 21 234",java.time.format.DateTimeFormatter.ofPattern("dd MM yyyy HH mm ss SSS"));
java.time.LocalDateTime fails = java.time.LocalDateTime.parse("20012014153621234",java.time.format.DateTimeFormatter.ofPattern("ddMMyyyyHHmmssSSS"));
Run Code Online (Sandbox Code Playgroud)
参考:http : //docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
问题:格式化程序/解析器似乎无法区分固定项和可变项。例如。用作“ dd”的d =“ day-of-month”可以是一两位数字(例如8或18)。因此,解析器在尝试解析下一个“项目”时不使用“固定”长度。但是“项目”没有分开并且解析失败。
我对吗?有解决办法吗?
编辑:有趣的是,这工作:
java.time.LocalDate date1 = java.time.LocalDate.parse("20140120", java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"));
java.time.LocalTime time1 = java.time.LocalTime.parse("153621234", java.time.format.DateTimeFormatter.ofPattern("HHmmssSSS"));
Run Code Online (Sandbox Code Playgroud)
但是为什么不选择日期和时间呢?
我正在从eclipse迁移到Android Studio.我在一些基本问题上遇到了困难,其中一个问题就是有效地检查日志.
在eclipse中,我经常检查logcat输出,最大化LogCat选项卡(双击选项卡以最大化,并再次最小化).这很快,可以从DDMS,Java或Debug角度完成.在Android Studio中,似乎只有一个透视图,DDMS框架固定在左下角.为了最大化,我现在发现的唯一方法是将窗口置于浮动模式(使用DDMS窗口角中的齿轮图标),然后调整其大小.为了最小化它,我再次单击齿轮图标并禁用浮动模式.
与eclipse相比,这是太多的工作.有没有更好的办法?
同样在logcat窗口中,在eclipse中显示所有列(时间,PID,TID,应用程序,标记,文本)并调整其大小.但是在Android Studio中我看不到列名,因此我不知道显示的是什么,并且无法调整列的大小.有没有配置列的方法?我在设置中找到的所有内容都是根据调试级别更改线条颜色的选项.
假设我有一个模块,我只想导出一个实例A.但是,这A需要在构造函数中传递B和C传递实例.所以我们也会在模块中声明它们:
public class SampleModule {
@Provides
@Singleton
A provideA(B b, C c){
return new A(b, c);
}
@Provides
@Singleton
B provideB(){
return new B();
}
@Provides
@Singleton
C provideC(){
return new C();
}
}
Run Code Online (Sandbox Code Playgroud)
这工作,但现在B并C也可在代码的其他地方.我希望将它们保密,并强制客户端类只能访问A.
有没有办法实现这个目标?
根据可用Location字段,在不考虑时间戳的情况下,浮动精度似乎是确定 GPS 位置好坏的主要字段。我想知道从 NMEA 数据(我认为是 $GPGGA)或通过LocationManager.getGpsStatus. 如何筛选高精度GPS位置?更具体地说,我也有兴趣了解:
谢谢。
android ×5
java ×4
asynchronous ×1
browser ×1
cancellation ×1
concurrency ×1
dagger ×1
dagger-2 ×1
formatter ×1
gps ×1
hard-coding ×1
http ×1
intercept ×1
java-8 ×1
java-me ×1
javascript ×1
jquery ×1
kotlin ×1
literals ×1
location ×1
logcat ×1
nmea ×1
parsing ×1
promise ×1
satellite ×1
screenshot ×1