小编Che*_*eng的帖子

从Java日历迁移到Joda日期时间

以前,当我第一次设计股票应用程序相关软件时,我决定使用它java.util.Date来表示股票的日期/时间信息.

后来,我意识到大多数方法都java.util.Date被弃用了.因此,很快,我重构了我的所有代码以供使用java.util.Calendar

但是,我遇到了两个缺点.

  1. 构造java.util.Calendar比较慢java.util.Date
  2. 在类的访问器getCalendar方法中Stock,我需要克隆一个副本,因为它Calendar是一个可变类

这是Stock.java的当前源代码

最近,我发现了Joda-Time.我做了以下基准,通过创建百万java.util.Date,java.util.Calendarorg.joda.time.DateTime.我发现在实例化过程中org.joda.time.DateTime表现更好java.util.Calendar.

这是基准测试替代文字 结果.

此实例化速度很重要,尤其是将创建许多Stocks实例,以表示股票的长期价格历史.

您认为从Java Calendar迁移到Joda Date Time是否值得获得应用程序速度性能?我需要注意什么陷阱?

java jodatime

10
推荐指数
1
解决办法
8489
查看次数

在头文件中有全局函数定义,避免重复的符号链接错误

我在标题文件中有以下代码.

#pragma once

class error_code {
public:
    unsigned __int64 hi;
    unsigned __int64 lo;    
};

std::ostream& operator<< (std::ostream& o, const error_code& e) {
    return o << "[" << e.hi << "," << e.lo << "]";
}
Run Code Online (Sandbox Code Playgroud)

我得到链接错误,当项目中有2个cpp包含此头文件时.

错误LNK2005:"类error_code __cdecl运算符|(类error_code const&,类ViTrox :: error_code const&)"(?? U @@ YA?AVerror_code @ 0 @ ABV10 @ 0 @ Z)已在xxx.obj中定义

我知道如果我将定义移动operator<<到cpp文件或DLL文件,我可以解决这个问题.

但是,我只想将它们放在SINGLE头文件中.有没有什么技术可以做到这一点?或者我必须将定义分离到另一个文件?

c++

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

更改listSeparatorTextViewStyle中使用的线条颜色

我有以下代码

        <TextView
            android:text="@string/hello"
            style="?android:attr/listSeparatorTextViewStyle" />
Run Code Online (Sandbox Code Playgroud)

我会得到以下效果.

在此输入图像描述

但是,我对色线感到不满意.我想有类似的东西

在此输入图像描述

我希望它在holo中有蓝色线条.我尝试以下自定义样式.

<style name="MyOwnListSeperatorTextViewStyle">        
<item name="android:background">@android:drawable/list_section_divider_holo_light</item>        
<item name="android:textAllCaps">true</item>    

<!-- Copy from Widget.TextView.ListSeparator -->

<item name="android:background">@android:drawable/dark_header_dither</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textColor">?textColorSecondary</item>
    <item name="android:textSize">14sp</item>
    <item name="android:gravity">center_vertical</item>
    <item name="android:paddingLeft">8dip</item>        
</style>
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为我得到以下错误.

错误:错误:资源不公开.(在'android:background',值为'@ android:drawable/dark_header_dither').

有想法如何更改使用的线条颜色listSeparatorTextViewStyle

android

10
推荐指数
1
解决办法
2万
查看次数

取消日历应用程序中的完成按钮 - 它是Action Bar的一部分吗?

Google日历应用

嗨,我在日历应用程序中引用了取消/完成按钮.这两个按钮固定在顶部,即使您滚动底部的"窗体",它们也始终可见.

我可以知道,它是Action Bar的一部分吗?如果是这样,实现应该如何?

android android-ui

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

我们什么时候应该使用LAYER_TYPE_HARDWARE

阅读http://developer.android.com/guide/topics/graphics/hardware-accel.html后,我对3种不同类型的分层技术的理解是(假设设备有GPU)

  • LAYER_TYPE_SOFTWARE - 绘图由软件的屏幕外位图存储器上的软件执行.然后,软件的屏幕外位图将传输到GPU.GPU 在屏幕上渲染位图.
  • LAYER_TYPE_NONE - GPU将直接在屏幕上绘制.
  • LAYER_TYPE_HARDWARE - GPU在GPU的屏幕外位图内存上执行绘制.GPU的屏幕外位图将由GPU 渲染到屏幕.

何时使用LAYER_TYPE_SOFTWARE

我理解某些绘制操作不受GPU支持setShadowLayer.因此,我们需要切换到LAYER_TYPE_SOFTWARE,以便绘制将由软件执行.

但是,由于软件的屏幕外位图内存转移到GPU操作,因此事情可能会变慢.

何时使用LAYER_TYPE_NONE

我认为这是大多数设备的默认设置.所以,我认为我们应该在大多数时候使用这种技术.

何时使用LAYER_TYPE_HARDWARE

我不知道何时使用这种技术.在我们应该应用LAYER_TYPE_HARDWARE技术时,我们非常感谢任何一个例子.

p/s另外,我对LAYER_TYPE _...的理解可能看似错误.如果你发现任何错误,请纠正我.谢谢.

android opengl-es

10
推荐指数
1
解决办法
2577
查看次数

我们什么时候应该使用android.arch.lifecycle:compiler(或android.arch.lifecycle:common-java8)?

目前,我们正在使用LiveDataViewModelRoom在我们的项目。

我们正在使用Java 8。

我们在下面使用 build.gradle

// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"

// Room (use 1.1.0-beta1 for latest beta)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
Run Code Online (Sandbox Code Playgroud)

我想知道我们什么时候需要使用

annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
Run Code Online (Sandbox Code Playgroud)

(或者implementation "android.arch.lifecycle:common-java8:1.1.1"因为我们正在使用Java 8 ?!)

目前,我们的代码可以正常运行,而无需使用lifecycle:compilerlifecycle:common-java8

android android-architecture-components

10
推荐指数
4
解决办法
4627
查看次数

WorkerManager是一种在应用程序中实现警报/提醒功能的可行方法吗?

我们注意到AlarmManagerCompat,由于AlarmManager不同版本的操作系统中的行为不同,仅在我们的应用程序中实现警报/提醒功能并不是一种可靠的方法.(例如,打盹模式)

最初,我们计划使用Evernote的android-job库来帮助我们在应用程序中实现警报/提醒功能.

但是,在此过程中,我们也注意到谷歌刚刚发布WorkerManager.

到目前为止,WorkerManager当我们在应用程序退出后运行一些一次性后台作业(几乎是即时的,具有互联网连接约束)时,对我们来说效果很好.

我们计划使用WorkerManager实现警报/提醒功能.

我想知道,WorkerManager实现这样的功能有多可靠?有人尝试过吗?我们的目标是API 15及更高版本.

android android-architecture-components android-workmanager

10
推荐指数
1
解决办法
1714
查看次数

为什么LiveData仍然通知处于onPause状态的Activity?

我有以下代码 Activity

@Override
public void onPause() {
    super.onPause();

    if (isFinishing()) {
        final LiveData<StickyNoteConfig> stickyNoteConfigLiveData = StickyNoteConfigRepository.INSTANCE.getStickyNoteConfig(mAppWidgetId);
        stickyNoteConfigLiveData.removeObservers(this);
        stickyNoteConfigLiveData.observe(this, stickyNoteConfig -> {
            // Weird, I still can receive call back.
            // I thought "this" is no longer active?
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我感到困惑的Observer是,虽然this活动已经处于onPause状态,但仍然被触发了?根据https://developer.android.com/reference/android/arch/lifecycle/Lifecycle.State#STARTED

为LifecycleOwner启动状态.对于活动,在两种情况下达到此状态:

after onStart call;
right before onPause call.
Run Code Online (Sandbox Code Playgroud)

我可以知道为什么会这样吗?

android android-livedata android-architecture-components

10
推荐指数
1
解决办法
1679
查看次数

如果我有一个长寿命LifeCycleOwner继续观察LiveData会导致资源泄漏吗?

在某些情况下,如Home Widget(AppWidgetProvider),我无法访问ActivityFragment.

通常,我使用ProcessLifecycleOwner.get()或以下LifeCycleOwner观察LiveData.

public enum ForeverStartLifecycleOwner implements LifecycleOwner {
    INSTANCE;

    private final LifecycleRegistry mLifecycleRegistry;

    ForeverStartLifecycleOwner() {
        mLifecycleRegistry = new LifecycleRegistry(this);
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,在回调中LiveData,我将尝试通过使用LifeCycleOwner来进一步观察.LiveDataliveData.removeObserver

但是,有一种情况

  1. LiveData无法触发回调.
  2. 因此,我没有在LiveData的回调中从LiveData中删除LifeCycleOwner.

在这种情况下,会导致资源泄漏吗?例如,GC注意到长寿命LifeCycleOwner正在观察LiveData A.虽然LiveDataA已经超出了范围,但GC不会解放LiveData A,因为长期生活LifeCycleObserver还在观察它吗?

如果是这样,我该如何解决这种泄漏?

android

10
推荐指数
1
解决办法
311
查看次数

WorkManager - 当我们同时使用默认初始化和自定义初始化时,我们是否应该删除默认初始化程序?

当我将 WorkManager 从“2.2.0”升级到“2.3.0-rc01”时,出现以下新错误

当我导出 APK 时发生错误。

C:\app: Error: Remove androidx.work.impl.WorkManagerInitializer from your AndroidManifest.xml when using on-demand initialization. [RemoveWorkManagerInitializer]

   Explanation for issues of type "RemoveWorkManagerInitializer":
   If an android.app.Application implements
   androidx.work.Configuration.Provider,
   the default androidx.work.impl.WorkManagerInitializer needs to be removed
   from the
   AndroidManifest.xml file.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我在 2.2.0 中没有收到这样的错误,因为从 2.1.0 开始引入了“按需初始化”。

根据https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#remove-default

我不确定将以下内容包含在我的AndroidManifest.xml.

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)

目前,以下是我的Application班级。

MyApplication 类

public class MyApplication extends MultiDexApplication implements Configuration.Provider {
    private static MyApplication me;

    @Override
    public void onCreate() {
        super.onCreate();

        me = …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager androidx

10
推荐指数
3
解决办法
2945
查看次数