小编hlu*_*kyi的帖子

Android中的静态字段

我是android和java开发的新手,我想了解一些事情.

  1. 在活动和片段之间使用静态字段传输数据是不好的做法吗?对我来说,它比在意图中使用额外更容易.

  2. 当我们可以将静态字段用于应用程序上下文的一点访问时,为什么许多程序在构造函数和方法中使用上下文作为参数?例如:

    public class ApplicationLoader extends Application {
    public static volatile Context context;
        @Override
        public void onCreate() {
            super.onCreate();
            context = getApplicationContext();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

那么有人可以解释一下,在哪种情况下应该在android中使用静态字段(我的意思是适用于类,如适配器,列表,上下文等)?当使用非静态字段,getter/setter时,额外的意图比静态字段更好吗?

java static android

9
推荐指数
2
解决办法
1916
查看次数

Android上的Kotlin Closable和SQLiteDatabase

我在我的项目中使用此代码

fun getAllData(): List<Data> = writableDatabase.use { db ->
    db.query(...)
}
Run Code Online (Sandbox Code Playgroud)

它在Lollipop设备上成功执行,但在Lollipop之前它会抛出ClassCastException

FATAL EXCEPTION: main
java.lang.ClassCastException: android.database.sqlite.SQLiteDatabase cannot be cast to java.io.Closeable
Run Code Online (Sandbox Code Playgroud)

可能是因为它是Java 1.6并且没有try-with-resources功能,但我不确定.

那么为什么我有这个例外以及它如何修复?

sqlite android kotlin

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

类型擦除如何工作

我正在调查创建代理对象的库是如何工作的,特别是我想了解它们如何从声明的方法中获取类型.例如Android的流行库 - Retrofit:

interface MyService {

    @GET("path")
    Call<MyData> getData();
}
Run Code Online (Sandbox Code Playgroud)

我很困惑 - 如何才能从这个界面获得正确的MyData类而不是原始对象?我的理解类型擦除的原因将删除放置在通用大括号内的任何信息.

我写了一些测试代码,令我惊讶的是从这样的代码获取类型真的很容易:

@org.junit.Test
public void run() {
    Method[] methods = Test.class.getDeclaredMethods();
    Method testMethod = methods[0];
    System.out.println(testMethod.getReturnType());
    ParameterizedType genericType = ((ParameterizedType) testMethod.getGenericReturnType());
    Class<Integer> clazz = (Class<Integer>) genericType.getActualTypeArguments()[0];
    System.out.println(clazz);
}

interface Test {
    List<Integer> test();
}
Run Code Online (Sandbox Code Playgroud)

它看起来有点脏,但它的工作和打印Integer.这意味着我们在运行时有类型.此外,我已经阅读了有关匿名类的另一个脏技巧:

System.out.println(new ArrayList<Integer>().getClass().getGenericSuperclass());
Run Code Online (Sandbox Code Playgroud)

AbstractList<E>这段代码打印原始

System.out.println(new ArrayList<Integer>() { }.getClass().getGenericSuperclass());
Run Code Online (Sandbox Code Playgroud)

打印ArrayList<Integer>.

这并不是让我困惑的最后一件事.在Kotlin中有一些具体的泛型,在编译时看起来像是一些黑客,但我们可以轻松地从泛型中获取类:

inline fun <reified T> test() {
    print(T::class)
}
Run Code Online (Sandbox Code Playgroud)

而现在我完全混淆了类型擦除机制.

  1. 有人可以解释一下,为什么有时它会保存信息而有时却没有?
  2. 为什么在Java中没有以正常方式实现泛型?是的,我读到它可能会破坏先前版本的兼容性,但我想了解如何.为什么泛型返回类型不会破坏任何东西但是new ArrayList<Integer>呢?
  3. 为什么匿名类包含泛型类型而不是类型擦除?

更新: 4.如何在Kotlin中使用具体化的泛型以及为什么这样的酷事不能用Java实现?

这里解释了如何使用仿制药. …

java generics jvm kotlin

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

Kotlin 内联函数和 Android 方法计数

我想了解内联函数如何影响classes.dex方法的数量和数量。根据我的理解,内联函数应该对方法计数的开销为零。然而,APK 分析器给了我相反的结果。我写了一个小测试来检查这个。

InlineFunction.kt 文件:

inline fun inlined(block: () -> Unit) {
    block()
}
Run Code Online (Sandbox Code Playgroud)

MainActivity.kt文件:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        inlined {
            println("Inlined")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从生成的代码的角度来看,它看起来很清楚:

public final class MainActivity extends AppCompatActivity {
    private HashMap _$_findViewCache;

    protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       String var2 = "Inlined";
       System.out.println(var2);
   }
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,没有调用其他方法。但是如果我用分析器打开 apk,我可以看到这个方法影响了定义和引用的方法计数。

在此处输入图片说明

另一方面,Kotlin stdlib 只影响引用的方法计数,而不影响定义的方法。

在此处输入图片说明

那么我错过了什么?我找不到关于 Android 中内联方法的任何好的来源以及它如何影响性能以及我找不到任何文档如何计算 dex 方法计数。

我找到了Jake Wharton 实用程序,但如果它工作正常,那么 Kotlin 库中的所有方法都会影响方法计数。这也意味着这个答案有问题/sf/answers/2774509461/

...标准库非常小,它的许多函数都是内联的,这意味着它们在编译后不存在,只是成为内联代码。Proguard 也可以处理很多事情......

那么内联函数如何影响方法计数呢?欢迎任何解释 …

java android compilation dex kotlin

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

Intellij IDEA REST Client 文件上传

我正在尝试通过 Intellij IDEA REST 客户端上传文件。我选择“要上传的文件(多部分/表单数据)”并选择要发送的文件。这个文件的参数名是什么?在我的 Sprint 控制器中,我使用此代码

@RequestMapping(method = RequestMethod.POST, value = "/{id}/photo")
public void setCover(@PathVariable int id,
                     @RequestParam MultipartFile file) {
    System.out.println(file.getName());
}
Run Code Online (Sandbox Code Playgroud)

我还为@RequestParam 尝试了不同的名称,例如“file”、“fileToSend”、“File to send”,但 Spring 始终找不到 MultipartFile 参数。

rest spring intellij-idea

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

标签 统计

android ×3

java ×3

kotlin ×3

compilation ×1

dex ×1

generics ×1

intellij-idea ×1

jvm ×1

rest ×1

spring ×1

sqlite ×1

static ×1