小编cdr*_*oid的帖子

Kotlin外围

我想在Kotlin中创建一个"匿名内部类"时访问调用类的范围.什么相当于Java的OuterScope.this语法?例如:

open class SomeClass {
    open fun doSomething() {
        // ...
    }
}

class MyClass {
    fun someFunc() {
        object : SomeClass() {
            override fun doSomething() {
                super<SomeClass>.doSomething()
                // Access the outer class context, in Java
                // this would be MyClass.this
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

kotlin

27
推荐指数
2
解决办法
6135
查看次数

Kotlin中的Lambda表达式

考虑以下Java类:

public class SomeClass {
    public interface Something {
        void doSomething();
    }

    public void call(Something something) {}
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,我可以使用lambda表达式,如下所示:

SomeClass().call { 
    // do something
}
Run Code Online (Sandbox Code Playgroud)

但是如果我在Kotlin中定义以下方法(使用相同的接口):

fun call(something: Something) {}
Run Code Online (Sandbox Code Playgroud)

然后这个电话:

call {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

会产生类型不匹配错误.为什么?

java lambda kotlin

27
推荐指数
2
解决办法
7611
查看次数

在工作线程内创建视图

我需要从EditText生成一个位图,然后对其执行一些操作.我主要担心的是不要View.buildDrawingCache()在UI线程上调用方法并且可能阻止它,特别是在谈论大屏幕(即Nexus 10)时,因为EditText它将占据可用屏幕大小的大约80%.

Runnable在一个内部执行s ThreadPoolExecutor,这将在工作线程上膨胀虚拟视图并为它们设置所有必需的属性,然后只需调用buildDrawingCache()&getDrawingCache()生成一个位图.

这在某些设备上运行良好但是最近我遇到了一些因以下消息而崩溃的设备:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Run Code Online (Sandbox Code Playgroud)

我理解为什么会这样,因为有些手机必须修改实施EditText,创建一个Handler,因此需要Looper.prepare()首先被调用.

从我在网上看到的内容,在工作线程中调用Looper.prepare()没有问题,虽然有人说这是非常不推荐但我找不到原因.

除此之外,与此问题相关的大多数帖子都表明您不应该在后台线程中夸大视图,可能是由于Android的官方文档(进程和线程)中的以下内容:

"Do not access the Android UI toolkit from outside the UI thread"
Run Code Online (Sandbox Code Playgroud)
  • 处理此问题的推荐方法是什么?

  • 从主线程调用build/get drawingcache有什么害处吗?(性能明智)

  • 在我的工作线程中调用Looper.prepare()会解决这个问题吗?

编辑

为了详细说明我的具体要求,我有一个用户界面,包括一个ImageView和一个自定义的EditText,EditText可以根据用户选择改变它的字体和颜色,它可以使用"放大/缩小".捏缩放"手势也可以拖动以允许用户将其重新定位在图像上方.

最后,我所做的是使用当前在UI上完全相同的值(宽度,高度,位置)在工作线程内创建一个虚拟视图,然后生成它的绘图缓存,原始图像的位图再次从本地文件解码.

一旦两个位图准备就绪,我将它们合并到一个位图中以备将来使用.

简单来说,执行以下代码(从后台线程中)有什么问题:

呼叫Looper.prepare()创建应用程序上下文一个新的观点,称measure()layout()手动,然后建立+从它那里得到drawingcache,即:

Looper.prepare();

EditText view = new EditText(appContext);

view.setText("some text");
view.setLayoutParams(layoutParams);

view.measure(
        View.MeasureSpec.makeMeasureSpec(targetWidth, View.MeasureSpec.EXACTLY),
        View.MeasureSpec.makeMeasureSpec(targetHeight, View.MeasureSpec.EXACTLY)); …
Run Code Online (Sandbox Code Playgroud)

multithreading android android-ui android-layout

16
推荐指数
1
解决办法
3552
查看次数

Kotlin仿制药

如何在Kotlin中为方法强制执行泛型类型?我知道你可以做以下事情:

var someVar: MutableSet<out SomeType> = hashSetOf()
Run Code Online (Sandbox Code Playgroud)

你怎么能对方法做同样的事情?

fun <T> doSomething() {
}
Run Code Online (Sandbox Code Playgroud)

我想强制执行T它的类型X或子类型.

谢谢.

generics kotlin

16
推荐指数
1
解决办法
1102
查看次数

Android:Fragments,SQLite和Loaders

所以我已经到了需要为我的应用程序实现SQLite数据库的地步.在"繁忙的编码器Android开发指南"之后,我创建了一个扩展的DatabaseHelper类SQLiteOpenHelper.

我的一个用例是对数据库运行查询并在a ListView内显示结果Fragment(我使用支持库中的片段).

根据我的理解,使用managedQuery()并不是真正合适的,即使它是不推荐的,因为这个方法中封装的一些逻辑实际上是在主线程上执行的,具体reQuery()是我理解的时候执行的Activity重新启动.

所以我Loader第一次尝试熟悉这门课,只看到这个:

"The only supplied concrete implementation of a Loader is CursorLoader, and that is only for use with a ContentProvider"

我最初的想法是实现我自己的内容提供商,并可能阻止其他应用程序访问它,然后我ContentProvider通过developer.android.com 阅读文档中的以下内容:

"You don't need a provider to use an SQLite database if the use is entirely within your own application."

我也一直在玩这个:

https://github.com/commonsguy/cwac-loaderex

但我不熟悉这个项目,也不确定它是否可以在生产环境中使用.

所以,现在我能想到的是AsyncTask在我的内部创建一堆实例Fragment并适当地管理它们的生命周期,确保它们在需要时被取消等等.

还有其他选择吗?

java sqlite android android-fragments

13
推荐指数
3
解决办法
3939
查看次数

在服务中实现线程池

我正在努力实现一个Service,当被请求将在几个并行线程上执行一些工作.

我的实现基于ThreadPoolExecutor类和a LinkedBlockingQueue.

作为一项基本规则,一旦完成所有任务并且队列中没有待处理的任务,我想停止服务(尽管稍后可以再次启动服务并遵循相同的逻辑).

我已经能够使用下面的代码达到预期的结果,但我不确定这种方法是否正确.

public class TestService extends Service {
    // Sets the initial threadpool size to 3
    private static final int CORE_POOL_SIZE = 3;

    // Sets the maximum threadpool size to 3
    private static final int MAXIMUM_POOL_SIZE = 3;

    // Sets the amount of time an idle thread will wait for a task before terminating
    private static final int KEEP_ALIVE_TIME = 1;

    // Sets the Time Unit to seconds
    private static final TimeUnit …
Run Code Online (Sandbox Code Playgroud)

java multithreading android android-service

11
推荐指数
1
解决办法
3613
查看次数