小编Ale*_*xey的帖子

Xml名称空间声明:自动替换包名称

我有一个带有多个构建目标的android项目(使用ant).出于测试目的,这些构建目标都具有不同的包名称(因此我的包名称为com.mycompany.myapp用于发布版本,com.mycompany.myapp.test用于测试版本).

除了布局文件中的自定义xml命名空间之外,这在大多数情况下都很有效.所以这:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.mycompany.myapp" />
Run Code Online (Sandbox Code Playgroud)

只要用com.mycompany.myapp.test替换包名称,它就会停止工作.
因此,我必须在预构建期间每次替换com.mycompany.myapp值.并且因为所有这些文件都应该是vcs,并且每次一个人切换配置并且它们合并时不应该发生冲突,我不得不将布局文件移动到特定的配置文件夹中,它们看起来像:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/@CONFIG.PACKAGENAME@" />
Run Code Online (Sandbox Code Playgroud)

现在这些文件存储在vcs中,并且在预构建期间替换了@ CONFIG.PACKAGENAME @,然后将文件从./config/file.xml复制到./res/layout/file.xml.

这非常不方便,并且不能很好地扩展(我无法想象在构建脚本中提到50个文件中的每一个).

所以我的问题是:有没有办法在命名空间声明中自动使用当前包名?或者至少是modife布局文件(或构建文件?),这样我每次更改包名时都不必替换com.mycompany.myapp.

xml ant android android-layout

47
推荐指数
1
解决办法
4万
查看次数

切换到Android应用程序包分发后,应用程序有时会与Resources $ NotFoundException崩溃

应用程序每月活跃用户超过20000.几个月来它一直在Google Play上播放.在我最近从使用.apk的分发切换到使用.aab进行分发之后,我开始接收崩溃和谷歌游戏商店的随机崩溃.在引入崩溃的构建中没有进行任何其他重大更改.

崩溃发生在应用程序的第一个屏幕上,同时膨胀xml布局.有问题的xml布局是一个简单的初始屏幕,只包含一个图像视图和一个textview.imageview是android.widget.ImageView,不是compat版本,它显示png图像,而不是矢量图像.图像存在于所有可绘制的文件夹变体中:drawable,drawable-mdpi,...,drawable-xxxhdpi.

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company/com.company.ui.splash.SplashActivity}: android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class ImageView
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
          at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
          at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
          at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
          at android.os.Handler.dispatchMessage(Handler.java:106)
          at android.os.Looper.loop(Looper.java:193)
          at android.app.ActivityThread.main(ActivityThread.java:6669)
          at java.lang.reflect.Method.invoke(Method.java)
          at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

   Caused by android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class ImageView


   Caused by android.view.InflateException: Binary XML file line #14: Error inflating class ImageView


   Caused …
Run Code Online (Sandbox Code Playgroud)

android google-play

29
推荐指数
1
解决办法
2256
查看次数

如何使用Hibernate和Spring Boot启用批量插入

我想在交叉表中插入大量实体.为此,我想启用hibernate的批量插入选项,这样每个插入一次不会添加1行,而是添加20行或50行.

我正在尝试重现hibernate教程的结果.我已经创建了一个测试函数,它将尝试插入30个客户,就像在示例中一样:

//Batch inserting test entities
//This code is inside transaction already, so I'm not creating a new one
entityManager.flush();
for (int i = 0; i < 30; ++i) {
    Customer customer = new Customer("Customer" + i, (i + 5) * 1000, "Position " + i);
    entityManager.persist(customer);
    if (i % 20 == 0) {
        entityManager.flush();
        entityManager.clear();
    }
}
entityManager.flush();
entityManager.clear();
Run Code Online (Sandbox Code Playgroud)

Customer类没有生成的id.

@Entity
public class Customer {

    @Id
    private String id;
    @Column
    private String name;
    @Column
    private long salary; …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa spring-boot

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

在IE11中执行缓慢的javascript,直到启用开发人员工具

我有一个非常大的javascript应用程序,其中主要包含asm.js代码(它是基于urho3d c ++引擎构建的,它们被编译成asm.js).

它在大多数浏览器(chrome,firefox,safari,edge)上都运行良好,但在IE11上却非常慢.问题是,在打开开发人员工具之前,它只会很慢.随着开发人员工具的开放,IE11变得快10倍,几乎和其他浏览器一样快.

以下是重现问题的最小示例:
http://test.sebbia.com/urho3d/test.html
在任何工作浏览器中打开页面,"运行 - 开始"消息和"运行 - 完成"消息之间的时间应该是大约1-2秒.
在没有开发者工具的情况下在IE11中打开页面,时间应该在35-50秒左右.
打开开发人员工具并重新加载,时间应该在2-3秒左右.

另一个重要的注意事项是,如果我在开发人员工具中开始分析会话,那么性能就会下降,就像开发人员工 所以我实际上可以描述问题.但是我花了几个小时进行分析,并且我尝试在大函数中插入日志消息,但我没有发现瓶颈.所有函数的执行时间大致相同,如果我在大函数的中间插入日志消息,它们通常会分成两个相似的部分.因此没有单一的函数负责减速,代码执行速度很慢.位移,函数调用,算术运算 - 与开放式开发人员工具相比,它们似乎只占用了太多时间.

我真的需要让我的应用程序在IE11上工作,并且它与开发人员工具打开的事实让我发疯.我试图找到一种方法让IE认为工具即使不工作也是开放的,或通过任何其他方式获得良好的性能.所以我的问题是如何在没有实际手动打开工具的情况下打开开发人员工具来实现与IE11相同的性能

这是一个非常广泛的问题,所以我想将其分解为几个较小的问题:

  1. 有没有办法让IE11认为开发人员工具是开放的?也许有一些像x-ua兼容的元标记我缺少?

  2. 当开发人员工具关闭时,导致速度放缓的原因是什么?我听说在IE8和9上没有开发者工具的情况下console.log函数调用很慢,也许在IE11上有类似的东西?也许asm.js没有优化?如果我知道造成这种情况的原因,我至少可以尝试重写代码来避免这种情况.

  3. 有没有办法从JavaScript代码打开开发人员工具?也许我可以要求用户按网站上的按钮"让应用更快".要求他们按F12或导航设置似乎太多了.

javascript performance internet-explorer-11 asm.js

11
推荐指数
2
解决办法
6504
查看次数

使用CGBitmapContextCreate创建的图像作为opengl纹理

我正在使用生成图像quartz2d,我想将其用作opengl纹理.棘手的部分是我想尽可能少地使用每个像素的位数,所以我创建cgContext如下:

int bitsPerComponent = 5;
int bytesPerPixel = 2;
int width = 1024;
int height = 1024;
void* imageData = malloc(width * height * bytesPerPixel);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageContext context = CGBitmapContextCreate(imageData, width, height, bitsPerComponent, width * bytesPerPixel, colorSpace, kCGImageAlphaNoneSkipFirst);
//draw things into context, release memory, etc.
Run Code Online (Sandbox Code Playgroud)

如文档中表示这里,这是唯一支持的RGB像素格式,CGBitmapContextCreate它采用每像素16位.所以现在我想将这个看起来像"1位跳过 - 5位红色 - 5位绿色 - 5位蓝色"的imageData上传到opengl纹理中.所以我应该这样做:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, imageData); …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es core-graphics

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

如何在 Android 中将 Spannable 转换为 AnnotatedString?

我有一个使用常规 Android 布局的大型项目。我开始在这个项目上使用 compose。然而,我已经有一个很大的代码库和很多处理 CharSequence 和 Spannable 的实用程序。例如,返回 Spannable 的货币格式化程序。

ComposeText既不接受 CharSequence 也不接受 Spannable。然而,它确实接受了AnnotatedString,而且据我所知,它们基本上是同一件事。所以我想一定有一种方法可以轻松转换SpannableAnnotatedString,类似spannable.toAnnotatedString(),但到目前为止我找不到任何东西。

我可以转换SpannableAnnotatedString还是必须从头开始编写大量代码?

android android-jetpack-compose

8
推荐指数
1
解决办法
3909
查看次数

如何手动将8.24位解交织的lpcm转换为16位lpcm?

我有一个数据块(void*),它是2 ch,44100 Hz,'lpcm'8.24位little-endian有符号整数,deinterleaved.我需要将该块记录为2 ch,44100 Hz,'lpcm'16位little-endian有符号整数.

我如何转换数据?我可以想象我需要做这样的事情:

uint dataByteSize = sizeof(UInt32) * samplesCount;
UInt32* source = ...;
UInt32* dest = (UInt32*)malloc(dataByteSize);
for (int i = 0; i < samplesCount; ++i) {
    UInt32 sourceSample = source[i];
    UInt32 destSample = sourceSample>>24;
    dest[i] = destSample;
}
Run Code Online (Sandbox Code Playgroud)

但是如何将deinterleaved转换为interleaved?

core-audio

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

从实体访问存储库或服务

我正在使用 Spring Boot 编写服务器应用程序。

大多数情况下,我在服务中编写所有业务逻辑,@Autowired用于访问存储库和其他服务。

但是,有时我想从@Entity类访问某些服务或属性,而不能使用@Autowired.

例如,我有一个应该能够将自身序列化为 JSON 的实体。在 JSON 中,它应该有 imageUrl 字段,其中包含图像名称(存储在数据库中并作为@Entity类中的属性)和基本 url,仅在 application.properties 中可用。这意味着我必须@Value@Entity类中使用注释,但它不能那样工作。

所以我创建了一个看起来像这样的服务:

@Service
public class FilesService {

    private static FilesService instance;

    @PostConstruct
    public void init() {
        FilesService.instance = this;
    }

    public static FilesService getInstance() {
        return instance;
    }

    @Value("${files.path}")
    String filesPath;
    @Value("${files.url}")
    String filesUrl;

    public String saveFile(MultipartFile file) throws IOException {
        if (file == null || file.isEmpty()) {
            return null;
        }
        String filename …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot

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

使所有gcm标记无效

我的应用程序使用gcm.每次用户登录时,都会注册新的gcm令牌并将其发送到我的第三方服务器.每次用户注销时,都会取消注册gcm令牌.这个炒锅没有任何问题.

问题是,当涉及到测试时,测试人员可以在不注销的情况下卸载应用程序,然后再次安装它并登录到另一个帐户.然后他将从两个不同的帐户收到两个gcms.这意味着他将收到私人gcms用于他目前没有进入的帐户.有时甚至可以通过实时用户进行此操作.

GCM文档指出,如果卸载了应用程序,gcm令牌有时会过期.实际上,这种情况从未发生过.
http://developer.android.com/google/gcm/gcm.html

GCM文档还声明您可以通过执行来注销GCM令牌

Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
startService(unregIntent);
Run Code Online (Sandbox Code Playgroud)

但是,如果您在重新安装后尝试使用此方法似乎不起作用.我收到回调告诉我令牌未注册,但gcm令牌仍然正常.

我的问题是:你能确保你的申请没有有效的gcm代币吗?我真的想在应用程序首次启动时取消注册所有现有令牌,或者至少从手机设置中重置它们.

android google-cloud-messaging

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

中断翻译动画并启动另一个

我有一个应用程序,我需要根据当前聚焦的子视图调整视图位置(它是一个具有可聚焦项目的列表,当前聚焦的项目必须位于屏幕的中心 - 用于从电视遥控器控制的电视应用程序).
必须使用动画调整位置.
我只使用了一个问题:如果用户在动画完成之前更改焦点(快速点击"向上"按钮两次),则下一个动画以"跳转"开始 - 它从与第一个相同的位置开始.

所以我尝试做的是取消之前的动画并启动另一个动画,然后从第一个动画开始的点开始新动画,这样用户就可以在动画中看到一个非常明显的跳跃,看起来非常糟糕.

这是代码:

@Override
public void requestChildFocus(final View child, final View focused) {
    super.requestChildFocus(child, focused);

    //this test code included for explanation
    Rect r = new Rect();
    child.getDrawingRect(r); //this will return view's position ignoring animation state
    Rect r2 = new Rect();
    child.getGlobalVisibleRect(r2); //as will this one too
    Log.d("Top: " + child.getTop() + "; Drawing rect: " +  r.toString() + "; global visible rect: " + r2.toString()); 
    //all of this methods will ignore changes that were …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-layout

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