我最近更新了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与Java 8并不完全相同.特别是Android的实现ConcurrentHashMap.keySet()返回一个Set,而Java 8的实现则ConcurrentHashMap.keySet()返回一个KeySetView.
不知何故,Android Studio已经设法使用标准的Java 8 JDK编译我的应用程序,因此在运行时期望找到带有签名的方法KeySetView<K,V> keySet().但是,Android ConcurrentHashMap没有这个签名的方法,所以我得到了一个NoSuchMethodError …
我的仓库使用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) 我注意到的Android 7(和前)和Android 8(测试版)时调用之间的差异startActivityForResult,从一个DialogFragment.
在MainActivity下面,被压在对话框中,当"OK",解聘本身,创建并显示一个新的对话框,并调用startActivityForResult了AnotherActivity.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
目前我有这样的事情:
@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)
我该如何实现这一目标?或者有没有更优雅的方法来实现同样的事情?
使用ContentResolver.applyBatch和ContentResolver.bulkInsert方法一次性添加数千个联系人非常慢。Android是否提供另一种方式来批量添加联系人,而这种方式会更快呢?
到目前为止,我已经尝试了以下方法:
使用applyBatch(每千个联系人约75秒)
对于每个联系人:
最后,使用ContentResolver.applyBatch来应用所有操作。
使用bulkInsert(每千个联系人约40秒)
对于每个联系人:
然后,使用ContentResolver.applyBatch应用所有操作。这将返回一个ContentProviderResults数组。
现在,对于每个联系人:
问题
在新安装的git bash(mingw32)中,键入“ git”。看到错误
bash:/ mingw32 / bin / git:错误的地址
在命令提示符下键入'C:\ Program Files(x86)\ Git \ mingw32 \ bin \ git.exe也可以
这里发生了什么?