Android Studio エミュレータのネットワーク設定

最近は使えるのかな,とひさびさにエミュレータ...

はい,DNSエラー.

エミュレータ内にて.


generic_x86:/ $ ifconfig
lo        Link encap:UNSPEC
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:310 TX bytes:310

eth0      Link encap:UNSPEC    Driver virtio_net
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe12:3456/64 Scope: Link
          inet6 addr: fec0::5054:ff:fe12:3456/64 Scope: Site
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3506 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3523 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:270699 TX bytes:274244


generic_x86:/ $ getprop
...
[net.bt.name]: [Android]
[net.eth0.dns1]: [10.0.2.3]
[net.eth0.gw]: [10.0.2.2]
[net.gprs.local-ip]: [10.0.2.15]
[net.qtaguid_enabled]: [1]
[net.tcp.default_init_rwnd]: [60]
...

仮想ネットワークは正しく構築できているようですが.

Set Up Android Emulator Networking | Android Studio

結局これ,パソコン上のDNSに Google Public DNS アドレスを追記で繋がるようになります.

Firewall などはONのままでよいです.

DNSとして設定されたルータのローカルアドレスをうまくエミュレータ側で認識/変換できないのだろうと思われます.

ちなみに,接続成功時のパソコン内にて以下.

~$ cat /var/run/resolv.conf
#
# Mac OS X Notice
#
# This file is not used by the host name and address resolution
# or the DNS query routing mechanisms used by most processes on
# this Mac OS X system.
#
# This file is automatically generated.
#
search flets-east.jp iptvf.jp
nameserver 192.168.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4

~ $ cat /etc/resolv.conf
#
# Mac OS X Notice
#
# This file is not used by the host name and address resolution
# or the DNS query routing mechanisms used by most processes on
# this Mac OS X system.
#
# This file is automatically generated.
#
search flets-east.jp iptvf.jp
nameserver 192.168.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4

Run Apps on the Android Emulator | Android Studio

エミュレータ内にて setprop -> restart network で接続できたとしても毎回いちいち面倒です.

戻ろう、Genymotion に。
→ Genymotion 無料版 を入れる 2018


Kotlin で static なメンバーをどう書くべきなのか?

092: Learning Kotlin – dealing with static-ness and (companion) objects costs – Fragmented

「companion object」だな. と思いながらとりあえず書く.


class Foo {
    companion object {
        val myVar = "testing"
    }
}

これを Kotlin から呼ぶ場合は,


Foo.myVar

ですが, Java から呼ぶ場合は,


Foo.Companion.getMyVar();

となり クソですね.

では, Jvm アノテーション を使います.


class Foo {
    companion object {
        @JvmField val myVar = "testing"
    }
}

この場合は Kotlin/Java それぞれ同じように呼べます.


// calling from Kotlin
Foo.myVar

// calling from Java
Foo.myVar;

なるべく入れたくないですよね Jvm なアノテーション.

const キーワード を使う


class Foo {
    companion object {
        const val myVar = "testing"
    }
}

以下, 共に問題ありません.


// calling from Kotlin
Foo.myVar

// calling from Java
Foo.myVar;

同様に, パッケージレベルでは,


class BottomSheetView {
    companion object {
        const val BOTTOM_SHEET_ANIMATION_TIMING = 500L
    }

    // ...
}


animation.setTiming(BottomSheetView.BOTTOM_SHEET_ANIMATION_TIMING)

Companion object is initialized from the static constructor of the containing class and plain object is initialized lazily on the first access to that object.

こんなかんじでしっくりくる記述って見つけにくい気がしません? Kotlin て.

“Static constants” in Kotlin | Kotlin Blog


Convert Java File to Kotlin の後に その1「メンバとコンストラクタ」

まずは「Convert Java File to Kotlin」で変換してなんとなくは動いていますが.

一通り公式リファレンスは流し読みしていましたが

コードをみているとKotolinの持つ恩恵を得ているような気がしません.

逆に分かりづらくなったようにも思えたりします.

先人たちのコードを見ながら自然なKotlinコードに書き換えていきましょう.

メンバとコンストラクタ

以下のようなJavaコード.


public class TasksPresenter implements TasksContract.Presenter {

    private final TasksRepository mTasksRepository;

    private final TasksContract.View mTasksView;

    private TasksFilterType mCurrentFiltering = TasksFilterType.ALL_TASKS;

    private boolean mFirstLoad = true;

    public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
        mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
        mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");

        mTasksView.setPresenter(this);
    }

android-architecture/TasksPresenter.java at todo-mvp · googlesamples/android-architecture

Kotlin のプロパティを使って適切に初期化します. ほとんどのメンバ変数に割り当てられたコンストラクタパラメータは必要ありません.


class TasksPresenter(val tasksRepository: TasksRepository, val tasksView: TasksContract.View)
    : TasksContract.Presenter {

    override var filtering = TasksFilterType.ALL_TASKS

    private var mFirstLoad = true

    init {
        tasksView.setPresenter(this)
    }

主コンストラクタに注釈や可視性修飾子がない場合は、コンストラクタキーワードを省略できます。

Classes and Inheritance - Kotlin Programming Language

Convert Java File to Kotlin の後に その1「メンバとコンストラクタ」

Convert Java File to Kotlin の後に その2 「apply」

Convert Java File to Kotlin の後に その3 「Null Safety」

Convert Java File to Kotlin の後に その4 「lateinit」

Convert Java File to Kotlin の後に その5 「String Templates」