小编bj0*_*bj0的帖子

模块库Jar未在Android Studio的外部库中显示

我无法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中的错误?

android intellij-idea android-studio

10
推荐指数
1
解决办法
388
查看次数

你如何捕获CancellationToken.Register回调异常?

我正在使用异步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块中,异常仍然没有被捕获.

c# task-parallel-library cancellationtokensource

9
推荐指数
3
解决办法
6281
查看次数

是否可以将单个注释应用于Kotlin中的多个使用地点目标?

根据文档: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它可以是多个线路.

annotations kotlin simple-framework

8
推荐指数
1
解决办法
628
查看次数

在android上通过udp://显示来自mpegts流的h264视频

在 Android 上通过 udp:// 显示来自 mpegts 流的 h264 视频。

几天来我一直在尝试让它发挥作用,但没有成功。我拥有的是一个生成 h264 视频流的设备,它通过原始 udp(不是 rtp)在 mpegts 容器中进行多播。我正在尝试让它显示在 Android 上的自定义应用程序中。

我读到 android 内置的 MediaPlayer 支持 h264 (avc) 和 mpegts,但它不处理 udp:// 流,所以我不能使用它(这将是迄今为止最简单的)。相反,我尝试手动将 mpegts 流解析为基本流,并将其传递给已传递到 SurfaceView 表面的 MediaCodec。无论我似乎尝试什么,总会发生两件事(一旦我修复异常等):

  • SurfaceView 始终是黑色的。
  • MediaCodec 总是接受大约 6-9 个缓冲区,然后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 h.264 android-mediacodec

6
推荐指数
1
解决办法
4857
查看次数

Android 5.0 Lollipop UsbDevice缺少接口

我写了一个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)

usb android android-5.0-lollipop

5
推荐指数
1
解决办法
1722
查看次数

有没有一种好方法可以将 xaml 绑定到依赖于多个其他属性的属性?

在我的一个 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,但我还没有找到。有吗,还是我只是在做梦?

c# wpf xaml dependency-properties

3
推荐指数
1
解决办法
1166
查看次数

为什么Observable.Finally在Observable.Generate结束时没有被调用?

我需要在两个状态之间交替,每个状态具有不同的间隔时间.
我能想到这样做的最好方法是使用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(). …

c# task-parallel-library system.reactive

2
推荐指数
1
解决办法
949
查看次数

NLog可以通过c#扩展方法保存呼叫站点信息吗?

编辑:虽然类似,但这与使用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等功能的唯一方法?

c# nlog

0
推荐指数
1
解决办法
1646
查看次数