我无法External Libraries在Android Studio中显示jar库.我正在尝试为此库添加javadoc,我在网上找到的唯一方法是右键单击库External Libraries并选择Library Properties....
项目结构是一个包含许多模块的树:
rootsdk /
main.jar
main-javadoc.jar
plugins /
plugin1 /
build.gradle
...
plugin2 /
build.gradle
...
...
Run Code Online (Sandbox Code Playgroud)
依赖项在build.gradle文件中声明,如:
compileOnly files('../../main.jar')
Run Code Online (Sandbox Code Playgroud)
如果我打开各个目录plugin1,则依赖项会External Libraries正确显示.但是,如果我打开rootsdk项目,它就不会出现.所有模块都是从根项目中列出并编译的,我可以使用库中定义的类,但它不会出现在下面External Libraries,所以我不能为它添加javadoc.
奇怪的是一些插件使用其他库,但定义不同:
repositories {
flatDir {
dirs 'libs'
}
}
...
implementation(name: 'core-debug', ext: 'aar')
Run Code Online (Sandbox Code Playgroud)
这些图书馆出现在External Libraries预期之下.
是否有东西缺少强制main.jar显示External Libraries,或者这是AS中的错误?
我正在使用异步I/O与HID设备进行通信,并且我希望在超时时抛出一个可捕获的异常.我有以下读取方法:
public async Task<int> Read( byte[] buffer, int? size=null )
{
size = size ?? buffer.Length;
using( var cts = new CancellationTokenSource() )
{
cts.CancelAfter( 1000 );
cts.Token.Register( () => { throw new TimeoutException( "read timeout" ); }, true );
try
{
var t = stream.ReadAsync( buffer, 0, size.Value, cts.Token );
await t;
return t.Result;
}
catch( Exception ex )
{
Debug.WriteLine( "exception" );
return 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
从Token的回调抛出的异常不会被任何try/catch块捕获,我不知道为什么.我以为它会被等待,但事实并非如此.有没有办法捕获这个异常(或让它由Read()的调用者捕获)?
编辑: 所以我重新阅读msdn上的文档,它说:"委托生成的任何异常都将从此方法调用中传播出来."
我不确定"传播出这个方法调用"是什么意思,因为即使我将.Register()调用移到try块中,异常仍然没有被捕获.
根据文档:https://kotlinlang.org/docs/reference/annotations.html
您可以将多个注释应用于单个站点使用目标,但是有没有办法将相同的注释应用于多个站点使用目标?
我的用例是使用SimpleXML的注释来装饰类.要使用一成不变的data class,你必须标注两者的字段和构造函数的参数:
data class Data(
@field:Element(name = "ID")
@param:Element(name = "ID")
val id: Int,
@param:Element(name = "TEXT")
@field:Element(name = "TEXT")
val text: String)
对于具有许多字段的数据类,您可以轻松地获得与实际代码一样多3倍的注释,并且最好消除重复.当你必须使用复杂的注释时,这尤其令人讨厌,因为ElementUnion它可以是多个线路.
几天来我一直在尝试让它发挥作用,但没有成功。我拥有的是一个生成 h264 视频流的设备,它通过原始 udp(不是 rtp)在 mpegts 容器中进行多播。我正在尝试让它显示在 Android 上的自定义应用程序中。
我读到 android 内置的 MediaPlayer 支持 h264 (avc) 和 mpegts,但它不处理 udp:// 流,所以我不能使用它(这将是迄今为止最简单的)。相反,我尝试手动将 mpegts 流解析为基本流,并将其传递给已传递到 SurfaceView 表面的 MediaCodec。无论我似乎尝试什么,总会发生两件事(一旦我修复异常等):
dequeueInputBuffer立即开始失败(返回 -1),并且我无法对其他任何内容进行排队。我可以将 mpeg 流拆分为 TS 数据包,然后将其有效负载加入 PES 数据包。我尝试将完整的 PES 数据包(减去 PES 标头)传递到 MediaCodec 中。
我还尝试通过将 PES 数据包拆分并将\x00\x00\x01其单独传递到 MediaCodec 中,将其拆分为单独的 NAL 单元。
我还尝试推迟传递 NAL 单元,直到收到 SPS NAL 单元并首先使用BUFFER_FLAG_CODEC_CONFIG.
所有这些都会导致上面提到的同样的结果。我不知道该尝试什么,所以任何帮助将不胜感激。
有几点我还不确定:
我见过的几乎所有示例都从 MediaExtractor 获取 MediaFormat,但我无法在流上使用它。少数不使用 MediaExtractor …
我写了一个Android实用程序,使用android UsbHost API与USB上的一些自定义设备进行通信.这在4.4中工作正常,但在5.0中,一些设备缺少它们的接口(getInterfaceCount()== 0).
我一直在使用CM11的Galaxy Note 3上使用它们并且它们一直工作正常,但由于这个版本的CM不稳定,我试图升级到CM12.问题出现了,我认为它可能是一个CM错误,所以我尝试了一个简单的程序,在谷歌5.0版本的Nexus 5上枚举设备/接口,也存在问题.
我使用Button和TextView创建了一个简单的测试应用程序,其中OnClickListener设置为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_usb);
Button button = (Button) findViewById(R.id.butt);
final TextView text = (TextView) findViewById(R.id.text);
final UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String string = "";
if( manager == null )
string += "no usb manager";
else {
for(UsbDevice device : manager.getDeviceList().values()) {
string += device.toString() + "\n";
string += String.format(" ifc: %d\n", device.getInterfaceCount());
}
}
text.setText(string);
}
}); …Run Code Online (Sandbox Code Playgroud) 在我的一个 WPF 项目中,我在 XAML 中创建了一个动画故事板,它具有可以在开始动画之前动态更改的计时属性。由于我需要一种方法来更改代码中的值,因此我将它们绑定到类的属性。
基本思想是动画有两个阶段,在情节提要中我使用 ObjectAnimationUsingKeyFrames 它占用总动画时间,所以我有这样的属性:
public TimeSpan RaiseTime { get; set }
public TimeSpan FallTime { get; set; }
public TimeSpan TotalTime
{
get { return RaiseTime + FallTime; }
}
Run Code Online (Sandbox Code Playgroud)
首次创建动画时,它会正确地从这些属性中获取值,但由于它们可以动态更改,因此我需要一种方法来通知 XAML 值已更改。
将 RaiseTime 和 FallTime 转换为 DependencyPropertys 很容易,以便它们的更改将反映在 XAML 绑定中,但是 TotalTime 呢?它本身没有价值,所以我不能把它变成一个 DP。
Yesturday 我花了几个小时搜索/尝试随机的东西来尝试让它工作,并最终使用 MultiBinding 到 RaiseTime 和 FallTime 和一个 IMultiValueConverter 工作,这要归功于一些 SO 问题和一篇博客文章: 将元素绑定到两个来源 http://blog.wpfwonderland.com/2010/04/15/simplify-your-binding-converter-with-a-custom-markup-extension/
我的问题是:这真的是最好的方法吗?这似乎(至少在我看来)如此简单的任务,但它需要这么多(主要是样板)代码才能工作。我认为必须有一种更简单、更简洁的方法来绑定 TotalTime 并将更新推送到 XAML,但我还没有找到。有吗,还是我只是在做梦?
我需要在两个状态之间交替,每个状态具有不同的间隔时间.
我能想到这样做的最好方法是使用Reactive Extensions的Observable.Generate非常棒.
根据我在msdn和其他网站上看到的内容,Observable.Finally()应该在observable"优雅或异常终止"时触发.我正在测试以下代码(在LINQPad中)以查看它是如何工作的,但我根本无法获取.Finall().
var ia = TimeSpan.FromSeconds(1);
var ib = TimeSpan.FromSeconds(.2);
var start = DateTime.UtcNow;
var ct = new CancellationTokenSource();
var o = Observable.Generate(
true,
// s => !ct.IsCancellationRequested,
s => (DateTime.UtcNow-start) < TimeSpan.FromSeconds(3) && !ct.IsCancellationRequested,
s => !s,
s => s ? "on" : "off",
s => s? ib : ia)
// .TakeUntil(start+TimeSpan.FromSeconds(3))
.Concat(Observable.Return("end"));
o.Subscribe( s=> s.Dump(), ct.Token);
var t = o.ToTask(ct.Token);
t.ContinueWith(x => x.Dump("done"));
o.Finally(() => "finallY".Dump()); // never gets called?
Thread.Sleep(10000);
ct.Cancel();
Run Code Online (Sandbox Code Playgroud)
如果我使Thread.Sleep 10s,可观察序列完成并且Task.ContinueWith触发,但不是.Finally().
如果我使Thread.Sleep 2s,可观察序列被取消并且Task.ContinueWith再次触发,但不是.Finally(). …
编辑:虽然类似,但这与使用NLog包装器的问题不同.扩展方法增加了另一个间接级别,这使得即使是正确的包装器也会报告错误的调用点
我目前在NLog周围使用了一个日志包装器,我使用他们在源代码中显示的技巧来获取准确的调用点信息.对于我开始的新项目,我想创建一个更简单的类,所以我只是实现了类似下面的接口:
public interface ILogger
{
void Log( LogEntry entry );
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个扩展方法类,如:
public static class LoggerExtensions
{
public static void Debug( this ILogger logger, string format, params object[] args)
{
logger.Log( new LogEntry( LogLevel.Debug, format, args ) );
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是NLog然后将调用点显示为扩展方法而不是扩展方法的调用者.我做了一些搜索,但找不到有关NLog和扩展方法的任何信息.
在这种情况下是否可以修复呼叫站点信息?或者是在接口本身中包含Debug,Info等功能的唯一方法?