小编Utt*_*sed的帖子

以某种方式使用错误的JDK(?)构建Android应用程序

我最近更新了Android Studio 3的Android项目.我想支持Java 8语言功能,因此在build.gradle中添加了以下内容:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
Run Code Online (Sandbox Code Playgroud)

然后我在Android 8.0.0设备上运行我的应用程序.在运行时我看到了

java.lang.NoSuchMethodError: No virtual method keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView; in class Ljava/util/concurrent/ConcurrentHashMap; or its super classes (declaration of 'java.util.concurrent.ConcurrentHashMap' appears in /system/framework/core-oj.jar)
Run Code Online (Sandbox Code Playgroud)

我认为这与keySet()Java 8 中的签名从返回Set<K>到返回的事实有关KeySetView<K,V>.

导致异常的行如下所示:

for (Long id : mSomeMap.keySet())
Run Code Online (Sandbox Code Playgroud)

KeySetView实现Set,当然Iterable,所以无论这条线被解释为Java 7还是Java 8,我都认为它可以工作.我对Java基础知识的理解是粗略的 - 这里发生了什么?

更新

到目前为止,我的愚蠢理解是:

虽然Android现在支持一些Java 8语言功能,但它的API与Jav​​a 8并不完全相同.特别是Android的实现ConcurrentHashMap.keySet()返回一个Set,而Java 8的实现则ConcurrentHashMap.keySet()返回一个KeySetView.

不知何故,Android Studio已经设法使用标准的Java 8 JDK编译我的应用程序,因此在运行时期望找到带有签名的方法KeySetView<K,V> keySet().但是,Android ConcurrentHashMap没有这个签名的方法,所以我得到了一个NoSuchMethodError …

java android concurrenthashmap java-8 android-studio-3.0

17
推荐指数
1
解决办法
1487
查看次数

无法使用git lfs克隆存储库

我的仓库使用git lfs。对于新克隆,我运行:

git lfs install
git clone https://example.com/repo.git
Run Code Online (Sandbox Code Playgroud)

克隆到开始下载lfs文件,到达某个文件然后失败的地步。每次尝试克隆时,失败的文件都不同。偶尔会成功。

这是输出:

Cloning into 'repo'...
remote: Counting objects: 35699, done.
remote: Compressing objects: 100% (17678/17678), done.
remote: Total 35699 (delta 15603), reused 35553 (delta 15545)
Receiving objects: 100% (35699/35699), 231.45 MiB | 11.12 MiB/s, done.
Resolving deltas: 100% (15603/15603), done.
Downloading big_file.big (157.39 KB)
...
Downloading some_other_big_file.big (18.84 KB)
Error downloading object: some_other_big_file.big

Errors logged to blah.log
Use `git lfs logs last` to view the log.
error: external filter 'git-lfs filter-process' failed …
Run Code Online (Sandbox Code Playgroud)

windows git git-lfs

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

Android O中DialogFragment中onActivityResult的不同行为

我注意到的Android 7(和前)和Android 8(测试版)时调用之间的差异startActivityForResult,从一个DialogFragment.

MainActivity下面,被压在对话框中,当"OK",解聘本身,创建并显示一个新的对话框,并调用startActivityForResultAnotherActivity.AnotherActivity马上结束.

在Android 7 onActivityResult上,在新的对话框实例上调用.在Android 8上,onActivityResult永远不会被调用.

谁能解释这种差异?

MCVE

public class MainActivity extends AppCompatActivity {

    private static final String FRAGMENT_TAG = "tag";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        new SomeDialogFragment().show(getFragmentManager(), FRAGMENT_TAG);
    }

    public static class SomeDialogFragment extends DialogFragment
    {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState)
        {
            super.onCreateDialog(savedInstanceState);

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            builder.setPositiveButton(
                    "OK",
                    new DialogInterface.OnClickListener()
                    {
                        @Override
                        public void onClick(DialogInterface d, int which) …
Run Code Online (Sandbox Code Playgroud)

android android-dialogfragment onactivityresult android-8.0-oreo

6
推荐指数
0
解决办法
230
查看次数

在数据类上的自定义“__init__”重写中调用生成的“__init__”

目前我有这样的事情:

@dataclass(frozen=True)
class MyClass:
  a: str
  b: str
  c: str
  d: Dict[str, str]
Run Code Online (Sandbox Code Playgroud)

...这一切都很好,除了dicts 是可变的,所以我不能使用我的类来键入另一本字典。

相反,我希望 fieldd类似于 a FrozenSet[Tuple[str, str]],但我仍然希望有人构造我的类的实例,以便能够在构造函数上传递字典,因为这更直观。

所以我想做一些类似的事情

@dataclass(frozen=True)
class MyClass:
  a: str
  b: str
  c: str
  d: FrozenSet[Tuple[str, str]] = field(init=False)

  def __init__(self, a, b, c, d: Dict[str, str]):
    self.original_generated_init(a, b, c)  # ???
    object.setattr(self, 'd', frozenset(d.items()))  # required because my dataclass is frozen
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?或者有没有更优雅的方法来实现同样的事情?

python python-3.x python-dataclasses

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

以编程方式批量添加数千个Android联系人

使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次性添加数千个联系人非常慢。Android是否提供另一种方式来批量添加联系人,而这种方式会更快呢?

到目前为止,我已经尝试了以下方法:

使用applyBatch(每千个联系人约75秒)

对于每个联系人:

  • 创建一个新的ContentValues对象以表示原始联系人
  • 生成一个新的ContentProviderOperation,将其插入到RawContacts表中
  • 将此操作添加到列表并存储其索引
  • 为其他联系人字段(例如姓名和电话号码)创建ContentValues对象
  • 生成一个新的ContentProviderOperation,以将其插入到Data表中,并向后引用原始联系人插入操作
  • 将这些操作添加到列表中

最后,使用ContentResolver.applyBatch来应用所有操作。

使用bulkInsert(每千个联系人约40秒)

对于每个联系人:

  • 创建一个新的ContentValues对象以表示原始联系人
  • 生成一个新的ContentProviderOperation,将其插入到RawContacts表中
  • 将此操作添加到列表中

然后,使用ContentResolver.applyBatch应用所有操作。这将返回一个ContentProviderResults数组。

现在,对于每个联系人:

  • 从相应的ContentProviderResult解析原始联系人ID。
  • 为联系人的所有数据字段构造一个ContentValues对象的数组,每个数据字段都带有一个原始联系人ID的字段
  • 使用ContentResolver.bulkInsert将它们插入到数据表中

问题

  • 在第二种方法中,我首先对RawContacts表条目执行applyBatch,然后对输入的Data表执行bulkInsert。这是因为我无法找到一种方法来提供Data条目的原始联系人ID。是否有与bulkInsert的反向引用类似的东西,可以让我同时添加RawContacts和Data条目?
  • applyBatch和bulkInsert只能在一个批处理中执行这么多插入操作,然后他们才抱怨事务太大。因此,必须每500个触点左右应用一次。有没有办法更改此限制?
  • 有没有一种完全不同的,更快的方式一次添加数千个联系人?

android android-contentresolver android-contacts

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

无法在git bash中运行“ git” ...“ bash:/ mingw32 / bin / git:错误的地址”

  • 完全卸载git
  • 全新安装git-2.11.0.windows.3(包括git bash)
  • 在新安装的git bash(mingw32)中,键入“ git”。看到错误

    bash:/ mingw32 / bin / git:错误的地址

  • 在命令提示符下键入'C:\ Program Files(x86)\ Git \ mingw32 \ bin \ git.exe也可以

这里发生了什么?

windows git mingw

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