質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

951閲覧

Kotlin 条件が真になるまで次の処理を行わないようにしたい

Haruto513

総合スコア52

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/01/20 02:14

編集2020/01/20 02:59

Android開発の勉強を行っている最中の初心者です。

画面に設置したボタンを押すと、あらかじめ設定しておいたURLからJSONデータをダウンロードし、リサイクラービューに表示するという処理を実装しようと考えています。
ダウンロード中はプログレスバーを表示し、その間は次の処理を行わないで待たせたいのですが、処理が先に進んでしまい、アプリが落ちてしまいます。
現在の書き方の以下のようになっています。

Kotlin

1 2private var _downloadData : String? = null 3 4//ボタン押下時実行 5 fun StartDownload(view: View) { 6 val preText = findViewById<TextView>(R.id.preText) 7 preText.isVisible = false 8 val progress = findViewById<ProgressBar>(R.id.progress) 9 10 val start = DownloadJsonData() 11 start.execute("") 12 13 while(_downloadStr == null) { 14 progress.isVisible = true 15 } 16 17 progress.isVisible = false 18 19 val bundle = Bundle() 20 bundle.putString("JsonData", _downloadStr) 21 22 val transaction = supportFragmentManager.beginTransaction() 23 val recyclerViewFragment = RecyclerViewFragment() 24 recyclerViewFragment.arguments = bundle 25 transaction.replace(R.id.recyclerViewFrame, recyclerViewFragment) 26 transaction.commit() 27 28 }

この_downloadStrがnullではなくなったときに、プログレスバーを非表示にし、リサイクラービューを生成するフラグメントを表示したいのですが、Kotlinではどのように書くのでしょうか。
宜しくお願い致します。

追記

DownloadJsonData()の中身です。

Kotlin

1 2   private inner class DownloadJsonData(): AsyncTask<String, String, String>() { 3 override fun doInBackground(vararg params: String?): String { 4 val urlStr = "https://api.myjson.com/bins/vxnji" 5 val url = URL(urlStr) 6 val con = url.openConnection() as HttpURLConnection 7 con.requestMethod = "GET" 8 con.connect() 9 val stream = con.inputStream 10 val sb = StringBuilder() 11 val reader = BufferedReader(InputStreamReader(stream, "UTF-8")) 12 var line = reader.readLine() 13 while(line != null) { 14 sb.append(line) 15 line = reader.readLine() 16 } 17 reader.close() 18 val result = sb.toString() 19 con.disconnect() 20 stream.close() 21 return result 22 } 23 24 override fun onPostExecute(result: String?) { 25 _downloadStr = result 26 } 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakajika

2020/01/20 02:54

DownloadJsonDataの実装はどうなっているのでしょう?そちらにコールバックを渡して、コールバック内でタスク完了時の処理を行うのが適切かと思います。
Haruto513

2020/01/20 03:01

追記しました。DownloadJsonData()の中身は、単純にURLからJSON文字列をダウンロードして、_downloadDataに渡すような処理にしてあります。 そして非常に浅学でお恥ずかしいところですが、コールバックというのはどのようなことを言うのでしょうか?
kakajika

2020/01/20 03:49

タスクが完了した時などに呼び出す関数を外部から渡せるようにすることです。調べてみてください。
Haruto513

2020/01/20 03:59

ありがとうございます!調べてみますね
guest

回答1

0

自己解決

フレームレイアウトとリサイクラービューを生成するフラグメントの表示を入れ替える処理を、DownloadJsonData()のoverride fun onPostExecute(result: String?) {}の中に書いたところ考えていた動きを実現できました。

Kotlin

1 2 fun StartDownload(view: View) { 3 val preText = findViewById<TextView>(R.id.preText) 4 preText.isVisible = false 5 val progress = findViewById<ProgressBar>(R.id.progress) 6 progress.isVisible = true 7 8 val start = DownloadJsonData() 9 start.execute("") 10 } 11 12private inner class DownloadJsonData(): AsyncTask<String, String, String>() { 13 override fun doInBackground(vararg params: String?): String { 14 val urlStr = "https://api.myjson.com/bins/vxnji" 15 val url = URL(urlStr) 16 val con = url.openConnection() as HttpURLConnection 17 con.requestMethod = "GET" 18 con.connect() 19 val stream = con.inputStream 20 val sb = StringBuilder() 21 val reader = BufferedReader(InputStreamReader(stream, "UTF-8")) 22 var line = reader.readLine() 23 while(line != null) { 24 sb.append(line) 25 line = reader.readLine() 26 } 27 reader.close() 28 val result = sb.toString() 29 con.disconnect() 30 stream.close() 31 //JSON文字列 32 return result 33 } 34 35 override fun onPostExecute(result: String?) { 36 _downloadStr = result 37 38 val bundle = Bundle() 39 bundle.putString("JsonData", _downloadStr) 40 41 val transaction = supportFragmentManager.beginTransaction() 42 val recyclerViewFragment = RecyclerViewFragment() 43 recyclerViewFragment.arguments = bundle 44 transaction.replace(R.id.recyclerViewFrame, recyclerViewFragment) 45 transaction.commit() 46 val progress = findViewById<ProgressBar>(R.id.progress) 47 progress.isVisible = false 48 } 49 50

投稿2020/01/20 04:19

Haruto513

総合スコア52

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問