在将Android Studio更新到2.2版(在Windows 10上)之后,第二天早上我在任何项目上构建了gradle时收到了这样的错误:
__PRE__
尽管gradlew -build命令已成功运行并完成.我尝试了WTF修复集的典型android开发:清理构建,无效缓存,删除构建文件夹,删除.gradle文件夹,尝试不同的gradle设置,甚至重新安装android工作室,没有任何帮助.
我创建这个问题只是为了与社区分享我的经验,因为我浪费了两个小时.
当项目从可见屏幕边界外移动到可见点时,我想支持自定义LayoutManager中的预测动画.
我做的所有灌装操作onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state).
根据支持预先布局阶段(state.isPreLayout())的预测动画的文档,我应该设置更改动画的初始条件(例如,在某处放置出现的视图)
问题是我无法找到一种方法来确定预先布局哪些视图将从外部移动,因为我只能使用附加到RecyclerView视图的当前操作,并且在预布局阶段之后onItemsMoved(RecyclerView recyclerView, int from, int to, int itemCount)调用方法.(例如在预布局之前调用onItemsRemoved )
它是错误的,LayoutManager或者我可以在预先布局中以某种方式确定哪些视图将很快被移动?
PS:我能够保持从可见点到外部的预测动画,因为我能够遍历可见视图并确定recycler.convertPreLayoutPositionToPostLayout将要移动哪些视图.
//childViews is an iterable over RecyclerView items
for (View view : childViews) {
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) view.getLayoutParams();
boolean probablyMovedFromScreen = false;
if (!lp.isItemRemoved()) {
//view won't be removed, but maybe it is moved offscreen
int pos = lp.getViewLayoutPosition();
//start view is a first …Run Code Online (Sandbox Code Playgroud) java android android-animation android-layout android-recyclerview
假设我们有这样的文件字符串
/** retrieve a state of the service
* <br/> HTTP code 200 - normal state
* <br/> HTTP code 403 - some recoverable state:
const val SERVICE_STATE = "servicestate" */
Run Code Online (Sandbox Code Playgroud)
这里有几个<br/>,我用来打破一条线,就像我在java中做的那样,但AndroidStudio的输出(在InteliJIdea中看起来相同)是
使用java,它被正确解析和显示:
/** retrieve a state of the service
* <br/> HTTP code 200 - normal state
* <br/> HTTP code 403 - some recoverable state */
public static final String SERVICE_STATE = "servicestate";
Run Code Online (Sandbox Code Playgroud)
我能以某种方式与kotlin和IntelijIdea达到同样的目的,也许kotlin可以在KDoc中打破这条线吗?
假设您有这样的具有默认参数的数据类
data class Info(
@DrawableRes
val iconRes: Int = 0,
@StringRes
val stringRes: Int = 0,
@LayoutRes
val layoutRes: Int = 0)
Run Code Online (Sandbox Code Playgroud)
所以你可以创建这样的数据类
val data = Info(
iconRes = R.drawable.icon,
stringRes = R.string.text,
layoutRes = R.layout.layout)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,没有任何lint错误
但是,当我尝试使用默认参数时,会发生lint错误:
val data = Info(
//here is expected resource of type drawable error
stringRes = R.string.text
layoutRes = R.layout.layout)
Run Code Online (Sandbox Code Playgroud)
似乎它在参数中使用位置,而不是确切的类型和名称.
我试过使用类似的显式注释@param:DrawableRes,但结果相同.
我可以以某种方式解决这个问题吗?我使用最新的Android Studio 3.0.
我知道这个问题已经被问到了,但我找不到合适的答案来解决我的问题.我希望你们能帮助我.
例外情况告诉Multiple dex files defined我,我尝试了几种常见的方法来解决这个问题.不幸的是,这没有帮助.
* What went wrong:
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Cause: com.android.dex.DexException: Multiple dex files define Lnet/jcip/annotations/GuardedBy;
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lnet/jcip/annotations/GuardedBy;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)
我试图清理并重建项目.
然后我尝试使高速缓存无效并重新启动.
我还运行此命令以了解依赖项中的重复:
./gradlew -q dependencies …
我创建了一个自定义布局管理的RecyclerView。我已通过启用了我的经理的构造函数中的自动测量setAutoMeasureEnabled(true)
当RecyclerView的layout_height设置为wrap_content与此属性LayoutManager是能够测量的高度RecyclerView,根据里面的物品。它工作正常,但是当我删除底部的最后一个项目时,正在播放删除的动画,这会RecyclerView导致在动画结束之前测量其高度到结果高度。
您可能已经猜到,此行为对于添加项目是正确的,因为在这种情况下,应在动画之前测量容器
RecyclerView动画结束后如何处理这种情况以使处理自动测量?我有所有孩子定位逻辑,onLayoutChildren但是我认为发布此问题不是必需的,它可能是如此广泛和不清楚。
可能我应该onMeasure手动处理layoutManager的拦截器(删除项目后调用4次(在onItemsRemoved调用之前进行一次))。因此,我可以根据删除开始时收到的高度在此处设置测量的高度:
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
super.onMeasure(recycler, state, widthSpec, heightSpec);
requestSimpleAnimationsInNextLayout();
if (!isAutoMeasureEnabled()) {
setMeasuredDimension(getWidth(), preHeight);
}
}
@Override
public void onItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) {
super.onItemsRemoved(recyclerView, positionStart, itemCount);
setAutoMeasureEnabled(false);
new Handler(Looper.myLooper()).postDelayed(new Runnable() {
@Override
public void run() {
setAutoMeasureEnabled(true);
requestSimpleAnimationsInNextLayout();
requestLayout();
} …Run Code Online (Sandbox Code Playgroud) 如您所知,java 中的每个匿名对象都包含对封闭类的隐藏引用。
但有了 kotling,事情就变得更加复杂了。
Lambda 是匿名类的另一种表示形式,但在 kotlin 中它的编译并不简单,因为如果 lambda 没有显式捕获封闭类的引用,那么它会像嵌套那样编译,而不是内部类(匿名类),并且不会泄漏。
但是内联函数呢?考虑下面的代码
class A {
fun test(){
val it = withReference {
//todo make sth
}
}
}
inline fun withReference(crossinline action: () -> Unit) = object: Reference {
override fun method1() {
action()
}
override fun method2() {
}
}
interface Reference {
fun method1()
fun method2()
}
Run Code Online (Sandbox Code Playgroud)
据我所知,内联函数会像非包装代码一样编译到 A 类,所以问题是开放的。
匿名是否object: Reference包含指向封闭类的链接A,这可能导致内存泄漏?
PS:我已阅读this article,但它不包含我的情况的答案
我有一个方法,执行片段添加动画和新片段填充所有屏幕:
public void addFragmentWithAnimation(Fragment fragment, boolean addToBackStack){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.add(R.id.lay_fragments, fragment);
commitTransaction(transaction);
}
Run Code Online (Sandbox Code Playgroud)
但是当动画播放用户仍然允许点击下面视图上的按钮并进行另一个ui操作时,这可能会导致不可预测的结果.有没有办法阻止应用程序中的所有用户操作,直到动画结束?
在我的 andorid 应用程序中,我使用 Retrofit2 发出 GET 请求:
http://myapi.com/items/list
Run Code Online (Sandbox Code Playgroud)
但我还想提出另一个要求,例如
http://myapi.com/items/list/filter/active:true,min_price:100
Run Code Online (Sandbox Code Playgroud)
所以过滤器参数是可选的。我正在尝试执行以下操作:
@GET("items/items/list{filter}")
Observable<ResponseItems> getItems(@Path("filter") String filter);
Run Code Online (Sandbox Code Playgroud)
并称之为:
service.getItems("")
Run Code Online (Sandbox Code Playgroud)
和:
service.getItems("/filter/active:true,min_price:100")
Run Code Online (Sandbox Code Playgroud)
但它不起作用。所以我最终创建了两个单独的服务调用,一个带有过滤器参数,另一个没有。我认为应该有更优雅的方法。
我正在尝试使用 protobuf 模型编写类的单元测试并在 Android Studio 中运行它们。
例如,这是一个简单的转换器测试
class UpdateConfigConverterTest {
private val testable = UpdateConfigConverter()
@Test
fun `should convert from proto model`() {
val url = "https://test.com"
val availableVersion = 1
val requiredVersion = 0
val result = testable.convert(
ProtoUpdateConfig.newBuilder()
.setAvailable(availableVersion)
.setRequired(requiredVersion)
.setUrl("https://test.com")
.build()
)
assertEquals(availableVersion, result.updateAvailableVersion)
assertEquals(requiredVersion, result.updateRequiredVersion)
assertEquals(url, result.url)
}
}
Run Code Online (Sandbox Code Playgroud)
被测类:
internal typealias ProtoUpdateConfig = UpdateConfig
internal class UpdateConfigConverter {
fun convert(source: ProtoUpdateConfig): UpdateConfig =
UpdateConfig(
updateAvailableVersion = source.available,
updateRequiredVersion = source.required,
url = source.url
)
} …Run Code Online (Sandbox Code Playgroud) 假设你有这样的课程:
@SomeScope
class ServiceScopeManager {
@Inject
Dependency1 dependency1;
@Inject
Dependency2 dependency2;
@Inject
ServiceScopeManager(){
}
@Inject
void init(){
//do something really important with dependencies
}
}
Run Code Online (Sandbox Code Playgroud)
@Provides模块中的任何方法正如您所看到的那样,它是高级类,例如,它可以侦听系统中的某些事件并执行其依赖项的释放.
问题是这个类不会被创建,因为没有任何东西依赖它.
我能以某种方式告诉匕首始终创建依赖于组件创建(例如),而不是默认需要时吗?或者可能以任何其他方式达到要求.