カテゴリー: Android

Kotlin OkHttp3で通信を行なった際の備忘

はじめに

こんにちはsuzukiです。今回OkHttp3を使いチャート情報を取得しテクニカルチャートの描画を予定していたのですが、OkHttpを導入するのにとても時間がかかってしまったため備忘もかねてこちらで記述していこうと思います。
備忘として残したい下記の5点です。

  • ライブラリの導入方法
  • Build時にエラーが発生する
  • AndroidManifest.xmlの記述
  • main関数で同期処理の通信
  • onFailureでUnable to resolve host “”: No addressが出力される

Androidに慣れている方は今更と思われる部分ばかりかもしれません。
しかしながら自分はかなり苦戦しました。。。

ライブラリの導入方法

build.gradle(Module:app)に下記の内容を追加

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    //OkHttpの追加
    implementation("com.squareup.okhttp3:okhttp:3.14.1")
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}

Build時にエラーが発生する

Syncも通りコードを少し記述しビルドしたところで下記のエラーが発生しました。
java.lang.ClassCastException: Bootstrap methaod returned null
コードからは参照も問題起きていなく、ライブラリが導入されていると判断していたのですが、もう少し記述することがありました。
こちらの記事を参考に
build.gradle(Module:app)に下記のコードを追加

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.macbook007.blogcharts"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //下記を追加
    compileOptions {
        targetCompatibility = "8"
        sourceCompatibility = "8"
    }
}

パーミッションの追加

インターネット接続にはAndroidManifestにパーミッションの追加を行う必要があります。
今回忘れませんでしたがいつか忘れそうです。

    

main関数で同期処理の通信

とりあえず通信を行いたく下記のコードを書いたところ、android.os.NetworkOnMainThreadExceptionとエラーが発生しました。
エラー内容のままですが、メインスレッドで通信を行うなということでした。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val client = OkHttpClient()
        val request = Request.Builder()
            .url("https://api.cryptowat.ch/markets/coinbase-pro/btcusd/ohlc")
            .build()
        val response= client.newCall(request).execute()
        println(response.body())

    }

上記のコードをenqueueを利用することによってとりあえずの通信を行いました。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val client = OkHttpClient()
        val request = Request.Builder()
            .url("https://api.cryptowat.ch/markets/coinbase-pro/btcusd/ohlc")
            .build()
        //enqueueを使用
        client.newCall(request).enqueue(object : okhttp3.Callback {

            @Throws(IOException::class)
            override fun onResponse(call: Call, response: Response) {

                val resString = response.body()?.string()
                println(resString)
            }

            override fun onFailure(call: Call, arg1: IOException) {
                println(arg1)
            }
        })
    }

onFailureでUnable to resolve host “”: No addressが出力される

こちらが一番苦戦しました。onFailureが呼ばれエラーを確認するとUnable to resolve host "": No addressと表示されています。
OkHttpが原因と考えていたのですが、、、原因はシミュレータがインターネット通信できていないため起きていました。
こちらの記事を参考に
システム環境設定>ネットワーク>接続済の通信を選択>詳細をタップ>DNSを選択>DNSサーバーに8.8.8.8を追加
を行い、念の為シミュレータを再起動したところ無事 onResponseが呼ばれて通信内容が確認できました。

さいごに

本当でしたらこのままMPAndroidChartを利用して取得したデータでテクニカルチャートを行いたかったのですが、先にOkHttpの備忘としてまとめさせていただきました。次回はテクニカルチャートを作成したいと思います。

おすすめ書籍

suzuki

シェア
執筆者:
suzuki
タグ: Kotlin

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前