我有一系列异步操作
private void doSomething(){
get("/something", new Callback(){
void onComplete(String data){
updateUi(something, data);
doSomethingElse();
}
});
}
private void doSomethingElse(){
get("/something/else", new Callback(){
void onComplete(String data){
updateUi(somethingElse, data);
doYetAnotherThing();
}
});
}
private void doYetAnotherThing(){
get("/yet/another/thing", new Callback(){
void onComplete(String data){
updateUi(yetAnotherThing, data);
allDone();
}
});
}
Run Code Online (Sandbox Code Playgroud)
这几乎没有问题:
我已经查看了以下选项来缓解这种情况:
ExecuterService#invokeAll - 我没有看到如何在不阻塞的情况下使用此解决方案.ListenableFutures及其transform方法.我看到这个在互联网坚果周围的几个地方提到我老实说,我不明白这将如何解决我的问题.所以,问题是:在Java中链接一系列异步调用的好方法是什么?寻找适用于Java 7的解决方案,因为我需要这个Android应用程序.
从源代码构建Android Automotive之后,我该怎么做
我正在尝试从源代码构建Android Automotive.我可以使用以下命令成功构建它:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-8.0.0_r11
$ source build/envsetup.sh
$ lunch car_emu_x86_64-userdebug
$ make -j8 V=1 &>> make.log
我的问题是如何运行模拟器?在谷歌搜索并浏览一些stackoverflow帖子后,我遇到了这个:
首先,我在命令行中设置一个env变量(模拟器使用它来确定要启动的模拟器)
export ANDROID_PRODUCT_OUT=/path/to/build_root
接下来,我创建了一个文件car-emulator.sh并将其放入其中(构建在Ubuntu机器上完成)
#!/usr/bin/env bash
ANDROID_BUILD_OUT=/path/to/build_root/out
PREBUILT=/path/to/build_root/prebuilts
EMULATOR_OUT=${ANDROID_BUILD_OUT}/target/product/car-x86_64
${PREBUILT}/android-emulator/linux-x86_64/emulator \
-sysdir ${EMULATOR_OUT} \
-system ${EMULATOR_OUT}/system.img \
-ramdisk ${EMULATOR_OUT}/ramdisk.img \
-data ${EMULATOR_OUT}/userdata.img \
-kernel ${PREBUILT}/qemu-kernel/x86_64/kernel-qemu \
-scale 0.7 \
-memory 512 \
-partition-size 1024
Run Code Online (Sandbox Code Playgroud)
我还尝试将相关的(darwin-x86_64)文件从构建机器下载到我的Mac笔记本电脑并尝试在那里运行.模拟器启动但立即崩溃,带有巨大的本机堆栈跟踪.
我的问题的下一部分是如何在设备上安装此图像?我看到CarService.apk已生成.在设备上安装此APK是否足够?或者CarService和相关软件包是否应该成为需要完整闪存的系统映像的一部分?
我使用Play开发了一个REST API!框架1.2.4,我对框架非常不满意.简单性和快速的开发周期帮助我实现了这一目标,只需花费我传统Java EE路线的一小部分时间.
现在我正在使用Play进行探索!2.0.3用于我的下一个项目.我看到虽然框架已得到增强,并且使开发Web应用程序变得更加容易,但关于REST API的情况也是如此.我的应用程序将不会有任何HTML - 我将仅使用XML或JSON或我将来决定使用的任何数据交换格式进行响应.
所以,问题是:
有没有人在这里使用Play 2.0.x来暴露非HTML纯REST API?
以下是我认为与1.2.x相比,在Play 2.0.x中开发纯REST API更困难的一些因素.如果我错了,请纠正我的理解.
在玩!1.2.4,我内容协商是建立在框架之上的.有一些选项可以在routes文件中定义请求所期望的内容类型.
GET /friends User.listFriends(format:'xml')
然后,在控制器中,
public static void getFriends(){
render();
}
Run Code Online (Sandbox Code Playgroud)
这将导致views/xml/User/listFriends.xml模板自动呈现.要明天添加对JSON的支持,我需要做的就是添加一个views/json/User/listFriends.json模板.
我不知道如何在游戏中做到这一点!2.0.x版本
经过一些反复试验,我发现可以在play文件夹中创建一个listFriends.scala.xml!2.0.然后,需要在控制器代码中调用它,如下所示:
return ok(views.xml.listFriends.render());
但是,Eclipse并不喜欢这样,因为Eclipse不知道views.xml.listFriends它只是在播放编译完成后生成的.这里有什么我想念的吗?
我知道Android的数据绑定库的目的是观察数据并在数据发生变化时自动更新.
问题:数据是否可以观察其他数据?例如,我可以有一个ObservableField"依赖"或"绑定"另一个或一组其他ObservableFields的值吗?目前,我已经手动实现了这一点 - 每当任何"dependee" ObservableField发生变化时,我都会计算相关字段并更新其值.
我的用例是我希望所有"逻辑"都在View之外 - 所以我想把我所有的逻辑放在"数据"类中(ViewModel如果可能的话).我有一个按钮,其状态我想设置为启用/禁用,具体取决于其他几个字段的内容.这个例子说明了我的想法.
我的布局文件看起来像这样
<layout>
<data>
<variable name="register" class="com.example.RegisterViewModel"/>
</data>
<LinearLayout>
<EditText
android:id="@+id/edUsername"
android:text="@{register.username}"/>
<EditText android:id="@+id/edPassword" />
<EditText android:id="@+id/edConfirm" />
<Button android:text="Register" android:enabled="@{register.isValid}" />
</LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
而且,我的View代码如下:
class RegisterView extends View {
@Override
protected void onFinishInflate() {
RegisterViewBinding binding = DataBindingUtil.bind(this);
RegisterViewModel register = new RegisterViewModel();
binding.setRegister(register);
binding.edPassword.setOnFocusChangeListener(new OnFocusChangeListener(){
@Override public void onFocusChange(View v, boolean hasFocus){
register.updateUsername(edPassword.getText().toString());
}
});
//Similarly for other fields.
} …Run Code Online (Sandbox Code Playgroud) 我有一个简单的Notes应用程序,其功能类似于Android NotePad示例.一个补充是每个笔记都可以有标签.A Note可以有几个Tags,一个Tag可以属于几个Notes - 从而使这成为多对多的关系.
我已使用外键和映射表完成了数据库设计.现在,我希望我的应用程序插入Android Search Framework,这需要使用a ContentProvider来公开我的数据.
这种情况是否有任何最佳实践?我确实在SO上找到了一些相关的问题,但大多数问题涉及一对多的关系(例如这个).我从这些问题中得出结论,最好ContentProvider每个数据库只有一个,然后使用Matcher概念来解析数据库中的多个表.这仍然留下了其他问题.
给定a Note ID,我想返回与该Note相关的所有标签.我如何设置ContentUri这种情况?既不会"content://myexample/note/#"也"content://myexample/tag/#"不会达到目的.
ContentProvider我所覆盖的6 种方法都不适合这样的目的,不是吗?我当然可以介绍一种新的方法,但我的消费者不会理解这种方法ContentProvider.
提前感谢您的建议.
每当我需要用Java设计API时,我通常会先打开我的IDE,然后创建包,类和接口.方法实现都是虚拟的,但javadocs是详细的.
这是最好的办法吗?我开始觉得API文档应该是第一个被淘汰的 - 甚至在第一个.java文件被写入之前.这没什么好处:
还有其他人分享这个意见吗?如果是这样,您如何开始使用API设计?
此外,有什么工具可以帮助吗?甚至可能是某种基于注释的工具,它可以生成文档,然后生成骨架源(类似于模型到代码生成器)?我遇到了Eclipse PDE API工具 - 但这是Eclipse插件项目特有的.我没有找到更通用的东西.
我想在Android上使用Dagger将一个实例Activity注入另一个类,如下所示:
class PresentationLayer{
Activity mActivity;
@Inject
public PresentationLayer(Activity activity){
this.mActivity = activity;
}
public void presentData(User user){
((TextView)mActivity.findViewById(R.id.username))
.setText(user.getName());
//...
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我能够做的注入,但对所有领域Activity都null在注射时间.
这是我如何进行注射:
我Activity本身就是一个模块.
@Module(
complete = false
)
class MainActivity extends Activity{
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.main_activity);
ObjectGraph objectGraph = CustomApplication.getObjectGraph();
PresentationLayer pres = objectGraph.get(PresentationLayer.class);
}
@Provides Activity provideActivity(){
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要模块
@Module(
entryPoints = PresentationLayer.class,
includes = MainActivity.class
)
class DaggerModule{
@Provides PresentationLayer …Run Code Online (Sandbox Code Playgroud) 我的应用程序的部分功能是扫描并显示WiFi接入点列表,然后连接到用户选择的接入点.我有这个功能工作.现在,我也希望在连接"通过"时收到通知.这应该相当简单,但我发现自己磕磕绊绊.
我在SO阅读了各种帖子,他们都提到了注册WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION或WifiManager.WIFI_STATE_CHANGED_ACTION.但是,这些都不适合我.谁能发现这段代码中的任何错误?(我要省略扫描和东西的部分)
预期的行为:一旦连接成功(即,当我看到通知栏上的"已连接"图标)时,应该收到广播,我应该看到祝酒词.
观察到的行为:当应用程序首次启动时收到广播,每当我切换回它时(即,无论何时onResume()被调用;或者我怀疑,每当我注册意图时)
public class WifiScanActivity extends Activity {
WifiManager mainWifi;
WifiReceiver mWifiReceiver;
IntentFilter mIntentFilter;
private final static String TAG = "WifiScanActivity";
public static final String INTENT_FOR_WIFI_CONNECTED =
WifiManager.WIFI_STATE_CHANGED_ACTION;
// public static final String INTENT_FOR_WIFI_CONNECTED =
// WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
mWifiReceiver = new WifiReceiver();
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
mIntentFilter.addAction(INTENT_FOR_WIFI_CONNECTED);
registerReceiver(mWifiReceiver, mIntentFilter);
mainWifi.startScan();
}
protected void onPause() {
unregisterReceiver(mWifiReceiver);
super.onPause();
}
protected …Run Code Online (Sandbox Code Playgroud) 避免Java中包名冲突的标准方法是使用反向域约定com.[mycompany].[rest-of-the-package-name].这非常有效......如果拥有域名[mycompany] .com.
但是,有几个个体开发者(或学生):
仅这就引入了包冲突的范围.
此外,假设我拥有[mycompany] .com.是什么阻止开发人员创建一个与我的包前缀相同并分发它的库?AFAIK,关于包名称没有法律约束力("你必须拥有你在Java包中使用的域名").更不用说开发人员的这一行动可能不是故意的(在我们命名我们的软件包之前,我们有多少人在网上寻找不存在的域名?).
更进一步,即使我拥有一个域名,它可能适合也可能不适合用作包名(我的域名可能包含连字符,或者它可能很长,虽然它是一个合法的包名,它仍然可以使它不切实际).
所以我的问题是:我如何真正使我的Java包名称独一无二?
假设我有一个简单的形状drawable绘制环如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:dither="true"
android:innerRadiusRatio="3"
android:shape="ring"
android:thicknessRatio="36"
android:useLevel="false" >
<gradient
android:centerColor="@android:color/holo_blue_bright"
android:centerY="0.001"
android:endColor="@android:color/holo_blue_dark"
android:gradientRadius="202.5"
android:startColor="@android:color/transparent"
android:type="radial"
android:useLevel="false" />
</shape>
Run Code Online (Sandbox Code Playgroud)
我将此形状应用为视图背景,如下所示:
<View
android:layout_width="96dp"
android:layout_height="96dp"
android:padding="16dp"
android:background="@drawable/custom_shape" />
Run Code Online (Sandbox Code Playgroud)
形状的确切细节与这个问题无关 - 只要说我有一个形状就足够了.现在,我不想硬编码形状的各种参数.我们thicknessRatio以此为例.如果我想根据屏幕配置改变厚度比,我当然会使用整数资源,如下所示.我有一个带有以下内容的values.xml:
<item name="thickness_ratio" type="integer" format="integer">56</item>
然后,android:thicknessRatio="@integer/thickness_ratio".
到现在为止还挺好.现在,我也希望我的形状有两种"风格" - 一个"大"和一个"小",我希望查询厚度比不依赖于配置,而是根据应用于视图的样式.这是什么样式和主题.所以,这是我尝试过的:
<resources>
<attr name="thicknessRatio" format="reference" />
</resources>
Run Code Online (Sandbox Code Playgroud)
<style name="CustomShapeSmall">
<item name="thicknessRatio">@integer/thickness_ratio_small</item>
</style>
<style name="CustomShapeLarge">
<item name="thicknessRatio">@integer/thickness_ratio_large</item>
</style>
Run Code Online (Sandbox Code Playgroud)
<item name="thickness_ratio_small" type="integer" format="integer">32</item>
<item name="thickness_ratio_large" type="integer" format="integer">56</item>
Run Code Online (Sandbox Code Playgroud)
android:thicknessRatio="?attr/thicknessRatio"
View:<View
android:layout_width="96dp"
android:layout_height="96dp"
android:padding="16dp" …Run Code Online (Sandbox Code Playgroud) android ×5
java ×5
android-auto ×1
android-wifi ×1
api-design ×1
asynchronous ×1
conflict ×1
dagger ×1
data-binding ×1
javadoc ×1
many-to-many ×1
package ×1
rest ×1
topdown ×1