小编Che*_*eng的帖子

从C代码调用C++静态成员函数

我有一堆C代码.我无意将它们转换为C++代码.

现在,我想调用一些C++代码(我不介意修改C++代码,以便它们可以通过C代码调用).

class Utils {
public:
    static void fun();
}

class Utils2 {
public:
    static std::wstring fun();
}
Run Code Online (Sandbox Code Playgroud)

如果我倾向于使用以下语法调用它们,它们将不会编译(我使用的是VC++ 2008,扩展名为.c的C代码文件)

Utils::fun();
// Opps. How I can access std::wstring in C?
Utils2::fun();
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

c c++

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

GSON fromJson返回LinkedHashMap而不是EnumMap

我想让gson能够返回一个EnumMap对象.我使用以下代码

package sandbox;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.EnumMap;
import java.util.Map;

/**
 *
 * @author yccheok
 */
public class Sandbox {

    public static void main(String[] args) throws InterruptedException {    
        testGson();
    }

    public static enum Country {
        Malaysia,
        UnitedStates
    }

    public static void testGson() {
        Map<Country, String> enumMap = new EnumMap<Country, String>(Country.class);
        enumMap.put(Country.Malaysia, "RM");
        enumMap.put(Country.UnitedStates, "USD");
        Gson gson = new Gson();
        String string = gson.toJson(enumMap);
        System.out.println("toJSon : " + string);
        enumMap = gson.fromJson(string, new TypeToken<EnumMap<Country, String>>(){}.getType());
        System.out.println("fromJSon : " …
Run Code Online (Sandbox Code Playgroud)

java gson

7
推荐指数
1
解决办法
3251
查看次数

获取操作栏菜单项的屏幕坐标以创建介绍屏幕

我想知道,是否有可能获得动作栏菜单项的屏幕坐标位置?因为我想创建一个介绍屏幕,绘制一个指向欲望操作栏菜单项的箭头,以便用户知道从哪里开始.

在此输入图像描述

android android-actionbar

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

从 LiveData 插入(或删除)单个列表项

我想知道,从 中插入(或删除)单个List项目有哪些常见做法LiveData

目前,这就是我打算做的。

我有以下 LiveData

LiveData<List<Animal>> animalListLiveData;
Run Code Online (Sandbox Code Playgroud)

这就是我计划观察它的方式。

animalListLiveData.observe(this, animalList -> {

    if (listView.getAdapter() == null) {
        // First time.

        ArrayAdapter<String> adapter = new ArrayAdapter<>(..., animalList);
        // Assign adapter to ListView
        listView.setAdapter(adapter);

    } else {
        // Update operation.

        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyDiffUtilCallback(animalList, oldAnimalList));
        diffResult.dispatchUpdatesTo(listView.getAdapter());
    }

    oldAnimalList.clear(); 
    oldAnimalList.addAll(animalList);
});
Run Code Online (Sandbox Code Playgroud)

这就是我要插入单个项目的方式 LiveData

animalListLiveData.getValue().add(newAnimal);
// Inform observer.
animalListLiveData.setValue(animalListLiveData.getValue())
Run Code Online (Sandbox Code Playgroud)

我觉得我的方法对于这样一个简单的更新操作来说太过分了。如果List是巨大的,DiffUtil需要扫描整个List.

其他开发人员和我有同样的感觉。https://github.com/googlesamples/android-architecture-components/issues/135

到目前为止没有提出好的解决方案。

我想知道,你有没有发现任何好的做法(模式),从 中插入(或删除)单个List项目LiveData

android android-livedata android-architecture-components

7
推荐指数
1
解决办法
6913
查看次数

HeaderScrollingViewBehavior 导致崩溃的原因是什么?

将应用程序投入生产后,我们收到了大量崩溃报告。坠毁的原因是HeaderScrollingViewBehavior

但是,我们对实际的根本原因一无所知,因为它没有指向我们的任何应用程序代码。

java.lang.IndexOutOfBoundsException:

java.lang.IndexOutOfBoundsException: 
  at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:6023)
  at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5958)
  at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5954)
  at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next (LinearLayoutManager.java:2226)
  at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1557)
  at androidx.recyclerview.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1517)
  at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:622)
  at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1 (RecyclerView.java:3941)
  at androidx.recyclerview.widget.RecyclerView.dispatchLayout (RecyclerView.java:3705)
  at androidx.recyclerview.widget.RecyclerView.onLayout (RecyclerView.java:4260)
  at android.view.View.layout (View.java:20962)
  at android.view.ViewGroup.layout (ViewGroup.java:6276)
  at android.widget.FrameLayout.layoutChildren (FrameLayout.java:325)
  at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
  at android.view.View.layout (View.java:20962)
  at android.view.ViewGroup.layout (ViewGroup.java:6276)
  at androidx.viewpager.widget.ViewPager.onLayout (ViewPager.java:1775)
  at android.view.View.layout (View.java:20962)
  at android.view.ViewGroup.layout (ViewGroup.java:6276)
  at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1842)
  at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1686)
  at android.widget.LinearLayout.onLayout (LinearLayout.java:1595)
  at android.view.View.layout (View.java:20962)
  at android.view.ViewGroup.layout (ViewGroup.java:6276)
  at android.widget.FrameLayout.layoutChildren …
Run Code Online (Sandbox Code Playgroud)

android

7
推荐指数
0
解决办法
466
查看次数

“您的应用程序包含不安全的加密模式” - 如何消除此警告?

几天前,在 Google Play Console 的“APK 预发布报告”中,它开始标记我

Unsafe encryption

Detected in APK ???

Your app contains unsafe cryptographic encryption patterns. Please see this Google Help Centre article for details.

Vulnerable classes:

c.j.a.s.J.b
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


但是,从 APK 早期开始,我没有更改任何加密代码/描述代码。因此,我不确定为什么 Google 开始在最近的 APK 上警告我?

知道如何解决吗?因为,易受攻击的类的信息c.j.a.s.J.b没有帮助。

我尝试使用 Proguard + mapping.txt 进行回溯,c.j.a.s.J.b但能够确定那是什么类。

知道如何摆脱谷歌安全警告吗?

android android-security

7
推荐指数
1
解决办法
5238
查看次数

CoreData CloudKit 中有哪些可靠的机制可以防止数据重复?

我们的每个数据行都包含一个唯一的uuid列。

以前,在采用CloudKit之前,uuid列有一个唯一的约束。这使我们能够防止数据重复。

现在,我们开始将 CloudKit 集成到我们现有的 CoreData 中。这种唯一的约束被删除。下面的用户流程,会造成数据重复。

使用CloudKit时导致数据重复的步骤

  1. 首次启动应用程序。
  2. 由于存在空数据,因此uuid生成具有预定义的预定义数据。
  3. 预定义数据同步到 iCloud。
  4. 该应用程序已卸载。
  5. 该应用程序已重新安装。
  6. 首次启动应用程序。
  7. 由于存在空数据,因此uuid生成具有预定义的预定义数据。
  8. 步骤 3 中先前的旧预定义数据已同步到设备。
  9. 我们现在有 2 个相同的预定义数据uuid!:(

我想知道,我们有没有办法防止这种重复?

在第 8 步中,我们希望有一种方法可以在写入 CoreData 之前执行此类逻辑

检查CoreData中是否存在这样的uuid。如果没有,则写入 CoreData。如果没有,我们将选择更新日期最新的数据,然后覆盖现有数据。

我曾经尝试将上述逻辑插入https://developer.apple.com/documentation/coredata/nsmanagementobject/1506209-willsave。为了防止保存,我正在使用self.managedObjectContext?.rollback(). 但它只是崩溃了。

您知道我可以使用哪些可靠的机制来防止 CoreData CloudKit 中的数据重复吗?


附加信息:

采用 CloudKit 之前

我们正在使用以下 CoreData 堆栈

class CoreDataStack {
    static let INSTANCE = CoreDataStack()
    
    private init() {
    }
    
    private(set) lazy var persistentContainer: NSPersistentContainer = {
        precondition(Thread.isMainThread)
        
        let container = …
Run Code Online (Sandbox Code Playgroud)

core-data ios swift cloudkit

7
推荐指数
1
解决办法
874
查看次数

这是一种很好的技术(使用数据持有者)来消除匿名类,以减少内存泄漏风险

匿名类很容易导致内存泄漏,尤其是在Android世界中,由于配置更改,Activity或Fragment可能会突然被破坏.这是许多例子中的一个.

http://chaosinmotion.com/blog/?p=696

http://blog.andresteingress.com/2011/10/12/anonymous-inner-classes-in-android/

https://blogs.oracle.com/olaf/entry/memory_leaks_made_easy

原因是,在Activity或中创建一个匿名类Fragment,匿名类将始终保持对Activityor 的隐式引用Fragment.因此,当Activity由于配置更改而趋于过时时,如果匿名类被外部世界暴露和保留,则无法进行垃圾回收.

那么,我想知道,是否使用数据持有技术是一种好方法,可以完全消除匿名类,以减少内存泄漏的风险?或者,我是偏执狂吗?

使用匿名类

public class HomeMenuFragment {
    private Parcelable selectedInfo = null;
    private List<View> homeMenuRows = new ArrayList<View>();

    private void fun() {
        ...
        ...
        row.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // homeMenuRows is member variable
                for (View r : homeMenuRows) {
                    r.setSelected(false);
                }
                row.setSelected(true);
                // selectedInfo is member variable
                selectedInfo = watchlistInfo;
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

使用数据持有者技术重构

public class HomeMenuFragment {
    private …
Run Code Online (Sandbox Code Playgroud)

java android

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

restartLoader和onContentChanged之间的区别

目前,我有一个装载机

@Override
public Loader<List<HomeMenuRowInfo>> onCreateLoader(int arg0, Bundle bundle) {
    return new HomeMenuRowInfosLoader(this.getSherlockActivity());
}
Run Code Online (Sandbox Code Playgroud)

有时,由于内容更改,我需要让加载程序重新加载.我会做的.

this.getLoaderManager().getLoader(0).onContentChanged();
Run Code Online (Sandbox Code Playgroud)

但是,我希望onCreateLoader在内容更改时将一些其他捆绑信息传递给回调.我意识到通过使用onContentChanged,没有办法这样做.

我能搞清楚的唯一方法是

this.getLoaderManager().restartLoader(0, bundle, this);
Run Code Online (Sandbox Code Playgroud)

我想知道,是否有任何重大分歧Loader的行为,使用的restartLoader不是onContentChanged,除了捆绑传递的能力吗?

android android-loadermanager android-loader

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

用户消息平台SDK:如何确定是否允许我们展示个性化广告或非个性化广告?

我们一直在使用已弃用的Google 移动广告同意 SDK

ConsentStatus让我们知道是否应该展示个性化广告或非个性化广告

请参阅源代码:https://github.com/googleads/googleads-consent-sdk-android/blob/main/consent-library/src/main/java/com/google/ads/consent/ConsentStatus.java

public enum ConsentStatus {
    @SerializedName("unknown")
    UNKNOWN,
    @SerializedName("non_personalized")
    NON_PERSONALIZED,
    @SerializedName("personalized")
    PERSONALIZED,
}
Run Code Online (Sandbox Code Playgroud)

Google 强烈建议我们迁移User Messaging Platform SDK

但是,我们注意到没有办法知道我们是否可以展示个性化广告或非个性化广告。新ConsentStatus外观如下。

public @interface ConsentStatus {
    int UNKNOWN = 0;
    int NOT_REQUIRED = 1;
    int REQUIRED = 2;
    int OBTAINED = 3;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


请问,如果我们应用User Messaging Platform SDK,我们应该使用什么样的逻辑来确定是否允许展示个性化广告或非个性化广告

android admob user-messaging-platform

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