AndroidもJavaも全くの素人です。
質問の仕方が間違っていたら申し訳ありません。
AndroidアプリでWebAPIから取得したデータを表示するサンプルプログラムを作成しています。
ネットで調べてサンプルを作成して、エミュレータで起動しました。
ボタンをクリックすると、アプリが消えます。
□ボタンを押すと画面があるので、落ちたわけではなさそうです。
ログを見ると、以下のログが出ています。
2020-09-02 11:46:23.126 14867-14910/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.myapplication, PID: 14867
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$4.done(AsyncTask.java:415)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.ExceptionInInitializerError
at okhttp3.internal.platform.Platform.get(Platform.java:85)
at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:263)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:229)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:202)
at com.example.myapplication.OkHttpGet.doInBackground(OkHttpGet.java:22)
at com.example.myapplication.OkHttpGet.doInBackground(OkHttpGet.java:12)
at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 30
at okhttp3.internal.platform.AndroidPlatform.buildIfSupported(AndroidPlatform.java:238)
at okhttp3.internal.platform.Platform.findPlatform(Platform.java:202)
at okhttp3.internal.platform.Platform.<clinit>(Platform.java:79)
at okhttp3.internal.platform.Platform.get(Platform.java:85)
at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:263)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:229)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:202)
at com.example.myapplication.OkHttpGet.doInBackground(OkHttpGet.java:22)
at com.example.myapplication.OkHttpGet.doInBackground(OkHttpGet.java:12)
at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
この記事を参考にしました。
https://qiita.com/spring_i/items/7fe37907237a80ceab57
実装はこんな感じです。
MainActivity
1package com.example.myapplication; 2 3import androidx.appcompat.app.AppCompatActivity; 4import android.os.Bundle; 5import android.util.Log; 6import android.view.View; 7import android.widget.Button; 8 9public class MainActivity extends AppCompatActivity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 16 // GETボタンとPOSTボタン取得 17 Button getButton = findViewById(R.id.getButton); 18 19 // GETボタンがタップされた時 20 getButton.setOnClickListener(new View.OnClickListener() { 21 @Override 22 public void onClick(View v) { 23 OkHttpGet getTask = new OkHttpGet(); 24 getTask.execute(); 25 } 26 }); 27 } 28}
OkHttpGet
1package com.example.myapplication; 2 3import android.os.AsyncTask; 4import android.util.Log; 5 6import java.io.IOException; 7 8import okhttp3.OkHttpClient; 9import okhttp3.Request; 10import okhttp3.Response; 11 12public class OkHttpGet extends AsyncTask<String,String,String> { 13 @Override 14 protected String doInBackground(String... strings) { 15 16 // url 17 String url = "http://xxx.jp/"; 18 // レスポンスデータ 19 String strData = ""; 20 21 // OkHttpのインスタンス生成 22 OkHttpClient client = new OkHttpClient(); 23 24 // urlを含めてリクエストをビルド 25 Request request = new Request.Builder() 26 .url(url) 27 .get() 28 .build(); 29 30 try { 31 // リクエスト実行 32 Response response = client.newCall(request).execute(); 33 // レスポンスのbodyからデータ取得 34 strData = response.body().string(); 35 } catch (IOException e) { 36 e.printStackTrace(); 37 } 38 return strData; 39 } 40 41 @Override 42 protected void onPostExecute(String str) { 43 Log.d("Debug",str); 44 } 45}
Module:
1apply plugin: 'com.android.application' 2 3android { 4 compileSdkVersion 30 5 buildToolsVersion "30.0.2" 6 7 defaultConfig { 8 applicationId "com.example.myapplication" 9 minSdkVersion 26 10 targetSdkVersion 30 11 versionCode 1 12 versionName "1.0" 13 14 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 15 } 16 17 buildTypes { 18 release { 19 minifyEnabled false 20 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 } 22 } 23 24 compileOptions { 25 targetCompatibility = "8" 26 sourceCompatibility = "8" 27 } 28} 29 30dependencies { 31 implementation fileTree(dir: "libs", include: ["*.jar"]) 32 implementation 'androidx.appcompat:appcompat:1.2.0' 33 implementation 'androidx.constraintlayout:constraintlayout:2.0.1' 34 testImplementation 'junit:junit:4.12' 35 androidTestImplementation 'androidx.test.ext:junit:1.1.2' 36 androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 37 implementation 'com.squareup.okhttp3:okhttp:3.14.1' 38}
activity_main.xml
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <TextView 10 android:id="@+id/textView3" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="Hello World!" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintLeft_toLeftOf="parent" 16 app:layout_constraintRight_toRightOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18 19 <Button 20 android:id="@+id/getButton" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:layout_marginStart="32dp" 24 android:layout_marginTop="32dp" 25 android:text="GET" 26 app:layout_constraintStart_toStartOf="parent" 27 app:layout_constraintTop_toTopOf="parent" /> 28 29 <TextView 30 android:id="@+id/textView" 31 android:layout_width="362dp" 32 android:layout_height="583dp" 33 android:layout_marginStart="32dp" 34 android:layout_marginTop="32dp" 35 app:layout_constraintStart_toStartOf="parent" 36 app:layout_constraintTop_toBottomOf="@+id/getButton" /> 37 38</androidx.constraintlayout.widget.ConstraintLayout>
素人なので、まずはJava入門からすべきなのでしょうが、時間が許さない事情があります。
解決のヒントでも頂けたら幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー