はじめに
こんにちはsuzukiです。今回OkHttp3を使いチャート情報を取得しテクニカルチャートの描画を予定していたのですが、OkHttpを導入するのにとても時間がかかってしまったため備忘もかねてこちらで記述していこうと思います。
備忘として残したい下記の5点です。
- ライブラリの導入方法
- Build時にエラーが発生する
- AndroidManifest.xmlの記述
- main関数で同期処理の通信
- onFailureでUnable to resolve host “”: No addressが出力される
Androidに慣れている方は今更と思われる部分ばかりかもしれません。
しかしながら自分はかなり苦戦しました。。。
ライブラリの導入方法
build.gradle(Module:app)に下記の内容を追加
1 2 3 4 5 6 7 8 9 10 11 12 | 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)に下記のコードを追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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にパーミッションの追加を行う必要があります。
今回忘れませんでしたがいつか忘れそうです。
1 | <uses-permission android:name="android.permission.INTERNET" /> |
main関数で同期処理の通信
とりあえず通信を行いたく下記のコードを書いたところ、
android.os.NetworkOnMainThreadException
とエラーが発生しました。
エラー内容のままですが、メインスレッドで通信を行うなということでした。
1 2 3 4 5 6 7 8 9 10 | 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を利用することによってとりあえずの通信を行いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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の備忘としてまとめさせていただきました。次回はテクニカルチャートを作成したいと思います。