76202


Kotlinでwebapiにpostしています。

返ってきたjsonをtextviewに表示しようとすると落ちてしまうのですが、何処がおかしいのでしょうか？よろしくお願いいたします。

apiは便宜的にjsonをオウム返しするものを作りました。

[code]

    import android.os.Bundle
    import android.util.Log
    import android.widget.Button
    import androidx.appcompat.app.AppCompatActivity
    import com.eclipsesource.json.Json
    import kotlinx.coroutines.Dispatchers
    import kotlinx.coroutines.GlobalScope
    import kotlinx.coroutines.async
    import kotlinx.coroutines.launch
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val URL = "https://www.hoge.com/test.php"
            val sendDataJson = "{\"id\":\"foo@hoge.com\",\"pw\":\"pass\"}"
            val getButton = findViewById(R.id.buttonGet) as Button
            getButton.setOnClickListener {
                getButton.setEnabled(false)
                onParallelGetButtonClick(URL,sendDataJson)
            }
        }
    
        //非同期処理でHTTP GET or POSTを実行します。
        fun onParallelGetButtonClick(URL: String, sendDataJson: String) = GlobalScope.launch(Dispatchers.Main) {
            val getButton = findViewById(R.id.buttonGet) as Button
    //        val textView = findViewById(R.id.text) as TextView
    //        ここのコメントを外すと落ちる。
    
            val http = HttpUtil()
            //Mainスレッドでネットワーク関連処理を実行するとエラーになるためBackgroundで実行
            val deferred = GlobalScope.async(Dispatchers.Default) {
                http.httpPost(URL,sendDataJson)
            }
            deferred.await().let {
                //minimal-jsonを使って　jsonをパース
                val result = Json.parse(it).asObject()
                val ret1 = result.getString("id", "no id data")
                Log.d("TAG",ret1)
    
    //            textView.setText(ret1)
    //            ここでテキストビューに表示したい。
    
                getButton.setEnabled(true)
            }
        }
    }
    
[/code]

[code]

    import okhttp3.MediaType.Companion.toMediaType
    import okhttp3.OkHttpClient
    import okhttp3.Request
    import okhttp3.RequestBody.Companion.toRequestBody
    
    object HttpClient {
        //OKHttp3はシングルトンで使う
        val instance = OkHttpClient()
    }
    
    class HttpUtil {
        private val JSON_MEDIA = "application/json; charset=utf-8".toMediaType()
        fun httpPost(url : String, jsonBody : String): String? {
            val request = Request.Builder()
                .url(url)
                .post(jsonBody.toRequestBody(JSON_MEDIA))
                .build()
    
            val response = HttpClient.instance.newCall(request).execute()
            val body = response.body?.string()
            return body
        }
    }
    
[/code]

[code]

    dependencies {
        implementation 'com.squareup.okhttp3:okhttp:4.9.0'  //http通信ライブラリ
        implementation 'com.eclipsesource.minimal-json:minimal-json:0.9.5' //jsonパースライブラリ
        def coroutines_version = '1.3.9' //Kotlin coroutines用ライブラリ(async, await)のバージョン
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" //Kotlin coroutines用ライブラリ(async, await)
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" //Kotlin coroutines用ライブラリ(async, await)
    }
    
[/code]

[code]

        <Button
            android:id="@+id/buttonGet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Get/Post"
            app:layout_constraintBottom_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView" />
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="16dp"
            android:layout_marginBottom="16dp"
            android:text="TextView"
            app:layout_constraintBottom_toTopOf="@+id/buttonGet"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="parent" />
    
[/code]

[code]

        <uses-permission android:name="android.permission.INTERNET" />
    
[/code]

[code]

    <?php
        //本番かデバッグか(json受け渡しの切替用)
        $debug = false;
    if ($debug) {
        //デバッグモード
        $json = array(
            "id"=>"foo@hoge.com",
            "pw"=>"pass"
        );
    } else {
        //本番モード
        $body = file_get_contents('php://input');
        $json = json_decode($body, true);
    }
        http_response_code(200);    //HTTPレスポンスコード(200正常終了)
        header('Content-Type: application/json; charset=UTF-8');
        header("X-Content-Type-Options: nosniff");
        echo json_encode($json, JSON_UNESCAPED_UNICODE);
        exit(0);
    ?>
    
[/code]


CC BY-SA 4.0
2021-05-28T19:36:19.177
76164
2021-05-30T10:50:20.280
2021-05-28T22:03:36.403
45544
45544
question
android kotlin webapi
WebAPI経由で取得したJSONをTextViewに表示しようとするとアプリが落ちてしまう


Kotlinコードでは`findViewById(R.id.text)`でアクセスしようとしているのに、ActivityのレイアウトXMLとおぼしきコードでは`android:id="@+id/textView"`となっています。`text`というIDを持つUI要素を本当に定義していますか？
していないのであれば **コンパイルエラー** になっているはずです。

一般的に、「落ちる」というのは、ソフトウェアの実行時にメモリアクセス違反や未処理例外などのランタイムエラーでプロセスが強制終了（クラッシュ）することを指す俗称です。コンパイルエラーは「落ちる」とは言いません。  
もし **コンパイルエラー** が発生しているのであれば、IDE (Androidの場合は通常Android Studio)
のビルドログとして出力されているコンパイラからのエラーメッセージを参考にしてコードの誤りを修正していきます。最近のIDEは優秀で、単純な構文エラーであれば実際にコンパイルする前にコードエディター上でリアルタイムに検出し、赤字で表示してくれるようになっています。  
もし **ランタイムエラー** が発生しているのであれば、デバッグコンソール (Androidの場合は通常Logcat)
にシステムやフレームワークから出力されているエラーメッセージを参考にしたり、try-
catch例外ハンドラーを明示的に記述して例外を捕捉することでエラーメッセージやスタックトレースを出力したりして、問題のある個所を特定・修正していきます。デバッガーで状態を確認しながらステップ実行し、問題を分析することもあります。

エラーメッセージはご丁寧に日本語にローカライズされていることもありますが、ほとんどは英語です。英語が読めないのであればプログラミング以前の問題であり、まず英語を学習してください。技術文書で使用される英語は平易な構文がほとんどで、最低限高校レベルの英語力があれば大抵なんとかなります。分からない単語はWeb検索で調べれば十分です。機械翻訳もありますが、英語から日本語への翻訳はまだまだ精度が低く、頓珍漢な翻訳をすることが多いのでお勧めしません。

  * [ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習 - Qiita](https://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%AD%E3%82%B0%E3%82%92%E8%AA%AD%E3%81%BE%E3%81%AA%E3%81%84)
  * [プログラミング言語 - エラー文って読まないの？｜teratail](https://teratail.com/questions/76445)
  * [超初心者のためのコードのデバッグ - Visual Studio | Microsoft Docs](https://docs.microsoft.com/ja-jp/visualstudio/debugger/debugging-absolute-beginners?view=vs-2019&tabs=csharp)


CC BY-SA 4.0
2021-05-30T10:50:20.280
76202
2021-05-30T10:50:20.280
15413
76164
answer