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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

0回答

1073閲覧

【Android】Futureを利用したスプレッドシートの非同期処理中にアプリがフリーズしてしまう

bpdjb3

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2021/12/03 12:48

編集2021/12/03 19:54

実現したいこと

非同期処理でスプレッドシートのセルから値を取得するプログラムを作成しています。
非同期処理中にアプリがフリーズしてしまうため、原因特定と対策を行いたいです。

発生している問題・エラーメッセージ

ExecutorServiceインスタンスをsubmitしたタイミングでアプリがフリーズします。
フリーズはValueRangeインスタンスであるresponseに読み込んだ値を代入するexecuteの実行で発生しています。
しかし、デバッグ中にエラーも出力されないため、詳細な原因がわかりません。

該当のソースコード

Java

1 ExecutorService bar = Executors.newSingleThreadExecutor(); 2 Future<List<String>> future = bar.submit(new Callable<List<String>>(){ 3 public List<String> call(){ 4 HttpTransport transport = AndroidHttp.newCompatibleTransport(); 5 JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 6 mService = new com.google.api.services.sheets.v4.Sheets.Builder( 7 transport, jsonFactory, mCredential) 8 .build(); 9 String spreadsheetId = URL; 10 String range = "data1!A2:E"; 11 List<String> results = new ArrayList<String>(); 12 try{ 13 ValueRange response = mService.spreadsheets().values() 14 .get(spreadsheetId, range) 15 .execute(); 16 List<List<Object>> values = response.getValues(); 17 if (values != null) { 18 results.add("スプレッドシート から読み込んだ値"); 19 for (List row : values) { 20 results.add(row.get(0) + ", " + row.get(1) + ", " + row.get(2) + ", " + row.get(3)); 21 } 22 } 23 return results; 24 }catch(Exception e){ 25 return results; 26 } 27 }}); 28 List<String> result = future.get(); 29

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

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

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

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

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

hoshi-takanori

2021/12/05 08:40

Google Sheets API よく分かりませんが、future.get() ってことはメインスレッドで待つってことだと思うので、あんまり良くない気がしますね…。
bpdjb3

2021/12/05 15:31

コメントありがとうございます。 全く詳しくないため想像が及ばないのですが、メインスレッドで実行結果を待つとどのようにまずいのでしょうか。もしよろしければご教示ください。
hoshi-takanori

2021/12/05 20:41

UI スレッド (Android ではメインスレッドではなく UI スレッドと呼ぶんだった…) を止めてはいけない理由はこの辺ですね。 https://developer.android.com/training/articles/perf-anr?hl=ja とはいえ、処理が終わればまた動き出すはずなので、憶測ですがフリーズするってことはどこかでデッドロックが発生してる可能性があるのかも…。
bpdjb3

2021/12/06 11:42

参考リンクありがとうございます。 Futureを利用したとしてもexecuteしなければ正常に動作するため、Future以外の非同期処理を検討します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問