我们怎样才能在这个阶段引入TDD?
嘲弄似乎是要走的路.但是我们在这里需要做的嘲弄似乎太多了.听起来需要为现有的东西(BO,数据库等)工作的模拟系统开发精心设计的基础设施.
这是否意味着TDD只有从头开始才是合适的方法?我很想知道在已经成熟的产品中引入TDD的可行策略.
大多数现代语言都内置了垃圾收集(GC).例如Java,.NET语言,Ruby等.事实上,GC以多种方式简化了应用程序开发.
我很想知道用GCed语言编写应用程序的限制/缺点.假设GC实施是最佳的,我只是想知道我们可能会受到GC的限制,无法做出一些优化决策.
我正在使用renderscript进行音频dsp处理.它运行良好,直到我决定将renderscriptTargetApi版本从19提升到24,试图以向后兼容的方式使用更新的renderscript API.
编译没有问题,但在运行时,logcat会显示这样的错误
05-31 19:40:23.097 8661-8734/com.example.audio.test E/RenderScript:无法打开共享库(/data/user/0/com.example.audio.test//lib/librs.xx .so):dlopen失败:未找到库"libRSSupportIO.so"
如果我有renderscriptTargetApi19或20,我的apk有librs.xx.so没有错误.如果我将它碰到21,23或24,librs.xx.so则不会生成,因此我有此运行时错误.
我正在通过NDK使用renderscript,即C++.也使用CMake.我没有找到通过NDK使用renderscript支持库的指令.所有指令都假定支持库是通过Java使用的.
这是来自 build.gradle
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
renderscriptTargetApi 24
renderscriptSupportModeEnabled true
renderscriptNdkModeEnabled true
Run Code Online (Sandbox Code Playgroud)
CMakeLists.txt 具有
add_library (dsp SHARED
${SRC_PATH}/dsp.cpp
${SRC_RS_PATH}/xx.rs ${SRC_RS_GENERATED_PATH}/ScriptC_xx.cpp)
target_compile_options(dsp PRIVATE
-std=c++11 -stdlib=libc++ -fno-rtti -fexceptions -Ofast)
target_link_libraries(dsp RScpp_static dl ${log-lib})
Run Code Online (Sandbox Code Playgroud)
这是 xx.rs
#pragma version(1)
#pragma rs java_package_name(com.example.audio)
#pragma rs_fp_relaxed
float RS_KERNEL my_kernel(float in, uint32_t x) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这就是从C++调用内核的方式
sp<RS> rs = new RS();
rs->init(app_cache_dir);
sp<const Element> e …Run Code Online (Sandbox Code Playgroud) android android-ndk renderscript android-support-library android-rendering
我浪费了两天时间尝试在全屏活动上执行点击操作.
为活动写一个espresso测试以执行点击
public class FullscreenActivityTest
extends ActivityInstrumentationTestCase2<FullscreenActivity> {
public FullscreenActivityTest() {
super(FullscreenActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
getActivity();
}
public void testClickingOnLayout() {
onView(withId(R.id.fullscreen_content)).perform(click());
}
Run Code Online (Sandbox Code Playgroud)
}
android.support.test.espresso.PerformException:
Error performing 'click' on view 'with id: com.example.espressodefect:id/fullscreen_content'
...
Caused by: android.support.test.espresso.PerformException:
Error performing 'Send down montion event' on view 'unknown'.
...
Caused by: android.support.test.espresso.InjectEventSecurityException: java.lang.SecurityException:
Injecting to another application requires INJECT_EVENTS permission
Run Code Online (Sandbox Code Playgroud)
满堆栈在这里.
我试过以下没有运气:
WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD)我在谷歌商店的应用程序崩溃报告中遇到了很多例外.有人能解释一下可能导致这种情况的原因吗?我使用的是android:targetSdkVersion = 19
java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10131 nor current process has android.permission.READ_PHONE_STATE.
at android.os.Parcel.readException(Parcel.java:1546)
at android.os.Parcel.readException(Parcel.java:1499)
at com.android.vending.billing.IInAppBillingService$Stub$Proxy.getSkuDetails(IInAppBillingService.java:251)
at com.inapp.util.IabHelper.querySkuDetails(IabHelper.java:920)
at com.inapp.util.IabHelper.queryInventory(IabHelper.java:550)
at com.inapp.util.IabHelper.queryInventory(IabHelper.java:522)
at com.inapp.util.IabHelper$2.run(IabHelper.java:617)
at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud) 我们对设计GUI进行原型设计,仅用于分析特定问题,概念证明等.有时我们会丢弃原型,有时它最终会出现在生产代码中.我们使用不同的语言,技术,策略和样式进行原型设计.
您通常采用哪种不同的原型以及如何进行原型设计?有什么好资源可以掌握这个技术吗?
我可以表达
第3页是标题页
在YAML
title: 3
Run Code Online (Sandbox Code Playgroud)
以下怎么样?
第10至15页包含第1章
一种方法是
chapter 1: [10, 11, 12, 13, 14, 15]
Run Code Online (Sandbox Code Playgroud)
我更喜欢这里的射程.在YAML中有类似的东西吗?
chapter 1: (10..15)
Run Code Online (Sandbox Code Playgroud)
**更新**
如果在YAML中没有范围这样的东西,以下将是我的选择
chapter 1:
start page: 10
end page: 15
Run Code Online (Sandbox Code Playgroud) 我们使用renderscript进行音频dsp处理.它很简单,并且对我们的用例显着提高了性能.但是USAGE_SHARED,对于具有启用GPU执行的自定义驱动程序的设备,我们遇到了一个恼人的问题.
您可能知道,USAGE_SHAREDflag使renderscript分配重用给定的内存,而不必创建它的副本.因此,它不仅可以节省内存,在我们的情况下,可以将性能提高到所需的水平.
以下代码USAGE_SHARED在默认的renderscript驱动程序(libRSDriver.so)上工作正常.使用自定义驱动程序(libRSDriver_adreno.so)USAGE_SHARED不会重用给定的内存,从而重用数据.
这是使用USAGE_SHARED和调用renderscript内核的代码
void process(float* in1, float* in2, float* out, size_t size) {
sp<RS> rs = new RS();
rs->init(app_cache_dir);
sp<const Element> e = Element::F32(rs);
sp<const Type> t = Type::create(rs, e, size, 0, 0);
sp<Allocation> in1Alloc = Allocation::createTyped(
rs, t,
RS_ALLOCATION_MIPMAP_NONE,
RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED,
in1);
sp<Allocation> in2Alloc = Allocation::createTyped(
rs, t,
RS_ALLOCATION_MIPMAP_NONE,
RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED,
in2);
sp<Allocation> outAlloc = Allocation::createTyped(
rs, t,
RS_ALLOCATION_MIPMAP_NONE,
RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_SHARED, …Run Code Online (Sandbox Code Playgroud) performance android signal-processing renderscript android-renderscript
我想从客户端(Android应用程序)管理主题订阅.我目前正在onCreate()上进行活动.我想知道正确的方法是在InstanceIdService :: onTokenRefresh()上订阅/取消订阅,还是在任何方便(按钮点击等).
简而言之,如果我在客户端管理主题订阅(没有服务器),我是否仍然需要使用InstanceIdService?
不同的文档来源对Firebase Cloud Messaging(FCM)主题订阅提供了不同的看法.有些人提到InstanceIdService,有些则没有.他们来了:
在谈论主题订阅时,它没有提到InstanceIdService.
完成设置任务后,您可以添加客户端代码以订阅主题,然后处理发送到主题的消息.
客户端应用程序可以订阅任何现有主题,也可以创建新主题.当客户端应用程序订阅新主题名称(Firebase项目尚不存在)时,将在FCM中创建该名称的新主题,随后任何客户端都可以订阅该主题.
要订阅主题,客户端应用程序会使用FCM主题名称调用Firebase Cloud Messaging subscribeToTopic():
FirebaseMessaging.getInstance().subscribeToTopic("news");
Run Code Online (Sandbox Code Playgroud)
MyFirebaseInstanceIdService类将是用于处理FCM逻辑的服务.此服务用于在生成新的InstanceID令牌时警告应用程序,并检索生成的令牌.
修改它以扩展FirebaseInstanceIdService并覆盖onTokenRefresh方法以订阅主题.使用以下代码更新MyFirebaseInstanceIdService中的onTokenRefresh方法,如下所示:
public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
private static final String FRIENDLY_ENGAGE_TOPIC = "friendly_engage";
/**
* The Application's current Instance ID token is no longer valid
* and thus a new one must be requested.
*/
@Override
public void onTokenRefresh() {
// If you need to handle the generation of a token, …Run Code Online (Sandbox Code Playgroud) 我正在做一些制作Xara Xtreme的决定,这是一个开源的SVG图形应用程序.他们的内存管理决策对我来说非常有趣,因为我天真地认为按需动态分配是编写面向对象应用程序的方式.
文档中的解释是
静态分配如何才能有效?
如果您习惯于大型动态数据结构,这对您来说可能很奇怪.首先,我们所有的对象(以及分配大小)都比(例如Impression)程序中的每个动态区域分配小得多(平均).这意味着虽然内存中可能存在许多漏洞,但它们很小.此外,我们在内存中分配的对象要多得多,因此这些漏洞很快就会被填满.此外,虚拟内存管理器将释放任何不包含分配的内存页面,并将此内存返回给操作系统,以便可以再次使用它(由我们或其他任务).
每当我们以这种方式分配内存时,我们都无需移动任何内存.这证明了ArtWorks的一个瓶颈,它也同时使用了许多小的分配.更多
简而言之,存在大量小对象和防止内存移动的需要是选择静态分配的原因.我对上述原因并不清楚.
虽然这谈到静态分配,但我从粗略看一下代码看到的是,在应用程序启动时动态分配内存块并保持活动直到应用程序结束,大致模拟静态分配.
你能解释静态分配在什么情况下比按需动态分配更好,以便将其视为严肃应用中的主要分配方式?
android ×5
renderscript ×2
android-ndk ×1
firebase ×1
memory ×1
mocking ×1
performance ×1
prototyping ×1
syntax ×1
tdd ×1
unit-testing ×1
yaml ×1