小编cur*_*zen的帖子

链接一系列异步调用

我有一系列异步操作

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)

这几乎没有问题:

  1. 无法在其他地方重用任何回调,因为每个回调都与"下一步"有关
  2. 重新排序操作或插入另一个操作是非直观的,涉及到整个地方跳跃.

我已经查看了以下选项来缓解这种情况:

  1. ExecuterService#invokeAll - 我没有看到如何在不阻塞的情况下使用此解决方案.
  2. RxJava - 如果可以的话,我宁愿避免在我的应用程序中进行这种范式转换!
  3. 番石榴ListenableFutures及其transform方法.我看到这个在互联网坚果周围的几个地方提到我老实说,我不明白这将如何解决我的问题.

所以,问题是:在Java中链接一系列异步调用的好方法是什么?寻找适用于Java 7的解决方案,因为我需要这个Android应用程序.

java asynchronous

11
推荐指数
1
解决办法
3019
查看次数

从源代码构建Android Automotive

TL; DR

从源代码构建Android Automotive之后,我该怎么做

  1. 运行汽车模拟器?
  2. 将CarService及相关软件包"安装"到设备上?

细节

我正在尝试从源代码构建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和相关软件包是否应该成为需要完整闪存的系统映像的一部分?

android-source android-auto

11
推荐指数
1
解决办法
4114
查看次数

是玩!Framework 2.0适合创建REST API吗?

我使用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版本

创建非html模板不太直观

经过一些反复试验,我发现可以在play文件夹中创建一个listFriends.scala.xml!2.0.然后,需要在控制器代码中调用它,如下所示:

return ok(views.xml.listFriends.render());

但是,Eclipse并不喜欢这样,因为Eclipse不知道views.xml.listFriends它只是在播放编译完成后生成的.这里有什么我想念的吗?

java rest playframework playframework-2.0

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

是否可以将一个ObservableField绑定到另一个?

我知道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)

data-binding android

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

Android Content Provider和多对多数据库关系

我有一个简单的Notes应用程序,其功能类似于Android NotePad示例.一个补充是每个笔记都可以有标签.A Note可以有几个Tags,一个Tag可以属于几个Notes - 从而使这成为多对多的关系.

我已使用外键和映射表完成了数据库设计.现在,我希望我的应用程序插入Android Search Framework,这需要使用a ContentProvider来公开我的数据.

这种情况是否有任何最佳实践?我确实在SO上找到了一些相关的问题,但大多数问题涉及一对多的关系(例如这个).我从这些问题中得出结论,最好ContentProvider每个数据库只有一个,然后使用Matcher概念来解析数据库中的多个表.这仍然留下了其他问题.

  1. 给定a Note ID,我想返回与该Note相关的所有标签.我如何设置ContentUri这种情况?既不会"content://myexample/note/#""content://myexample/tag/#"不会达到目的.

  2. ContentProvider我所覆盖的6 种方法都不适合这样的目的,不是吗?我当然可以介绍一种新的方法,但我的消费者不会理解这种方法ContentProvider.

提前感谢您的建议.

android many-to-many android-contentprovider

8
推荐指数
2
解决办法
2816
查看次数

用自上而下的方法用Java设计API - 写Javadoc是最好的起点吗?

每当我需要用Java设计API时,我通常会先打开我的IDE,然后创建包,类和接口.方法实现都是虚拟的,但javadocs是详细的.

这是最好的办法吗?我开始觉得API文档应该是第一个被淘汰的 - 甚至在第一个.java文件被写入之前.这没什么好处:

  1. API设计人员可以完成设计和规范,然后在多个实现者之间拆分实现.
  2. 更灵活 - 设计更改不需要在java文件中反弹,寻找编辑javadoc注释的位置.

还有其他人分享这个意见吗?如果是这样,您如何开始使用API​​设计?

此外,有什么工具可以帮助吗?甚至可能是某种基于注释的工具,它可以生成文档,然后生成骨架源(类似于模型到代码生成器)?我遇到了Eclipse PDE API工具 - 但这是Eclipse插件项目特有的.我没有找到更通用的东西.

java javadoc api-design topdown

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

Dagger for Android:在调用setContentView后向对象图中注入一个Activity

我想在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)

我能够做的注入,但对所有领域Activitynull在注射时间.

这是我如何进行注射:

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)

java android dependency-injection dagger

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

连接到WiFi接入点时未收到WIFI_STATE_CHANGED_ACTION意图?

我的应用程序的部分功能是扫描并显示WiFi接入点列表,然后连接到用户选择的接入点.我有这个功能工作.现在,我也希望在连接"通过"时收到通知.这应该相当简单,但我发现自己磕磕绊绊.

我在SO阅读了各种帖子,他们都提到了注册WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTIONWifiManager.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)

android android-wifi

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

如何*确实*确保我的Java包名称是唯一的?

避免Java中包名冲突的标准方法是使用反向域约定com.[mycompany].[rest-of-the-package-name].这非常有效......如果拥有域名[mycompany] .com.

但是,有几个个体开发者(或学生):

  • 不(或不能承担)拥有域名
  • 仍然想起一些包名,希望它们是独一无二的.

仅这就引入了包冲突的范围.

此外,假设我拥有[mycompany] .com.是什么阻止开发人员创建一个与我的包前缀相同并分发它的库?AFAIK,关于包名称没有法律约束力("你必须拥有你在Java包中使用的域名").更不用说开发人员的这一行动可能不是故意的(在我们命名我们的软件包之前,我们有多少人在网上寻找不存在的域名?).

更进一步,即使我拥有一个域名,它可能适合也可能不适合用作包名(我的域名可能包含连字符,或者它可能很长,虽然它是一个合法的包名,它仍然可以使它不切实际).

所以我的问题是:我如何真正使我的Java包名称独一无二?

java conflict package

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

Shape Drawable参数取决于应用的样式

假设我有一个简单的形状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".

到现在为止还挺好.现在,我也希望我的形状有两种"风格" - 一个"大"和一个"小",我希望查询厚度比不依赖于配置,而是根据应用于视图的样式.这是什么样式和主题.所以,这是我尝试过的:

步骤1:声明厚度比的属性(attrs.xml):

<resources>
        <attr name="thicknessRatio" format="reference" />
</resources>
Run Code Online (Sandbox Code Playgroud)

第2步:使用此属性声明两个样式(styles,xml):

<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)

第3步:在values.xml中定义两个整数:

<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)

第4步:在Shape Drawable中查询自定义属性:

android:thicknessRatio="?attr/thicknessRatio"

第5步:将所需的样式应用于View:

<View
    android:layout_width="96dp"
    android:layout_height="96dp"
    android:padding="16dp" …
Run Code Online (Sandbox Code Playgroud)

android android-theme android-drawable android-styles

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