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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Java

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

Android Studio

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

Q&A

解決済

2回答

173閲覧

プログレスが表示されない

tanuki_

総合スコア39

Java

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

Android Studio

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

0グッド

0クリップ

投稿2024/11/08 08:23

編集2024/11/08 08:30

実現したいこと

ソースコードの処理が終わるまでプログレスを表示したい。

発生している問題・分からないこと

処理はきちんと組み込んでいるつもりなのですがプログレスが表示されない。

該当のソースコード

TimetableActivity.java

1 //データ検索 2 @RequiresApi(api = Build.VERSION_CODES.O) 3 private void SearchData(){ 4 // プログレスの表示 5 mProgressDialog = new CustomProgressDialog(TimetableActivity.this); 6 mProgressDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 7 mProgressDialog.show(); 8 9 //リスト更新 10 getData(storeCode); 11 mControlAdapter = new ControlAdapter(getApplicationContext(), mReserve, mReservationDataByDate); 12 mControlList.setAdapter(mControlAdapter); 13 Collections.sort(mReserve, itemComparator); 14 mControlAdapter.notifyDataSetChanged(); 15 16 // プログレスが表示されていれば閉じる 17 if (mProgressDialog != null && mProgressDialog.isShowing()) { 18 mProgressDialog.dismiss(); 19 } 20 } 21 22public class CustomProgressDialog extends Dialog { 23 /** 24 * コンストラクタ 25 * 26 * @param context コンテキスト 27 */ 28 public CustomProgressDialog(Context context) { 29 super(context, R.style.Theme_CustomProgressDialog); 30 31 // レイアウトを決定 32 setContentView(R.layout.progress_activity); 33 } 34} 35

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

プログレスで検索して組み込んでみたのですが上手く動作しません。

補足

特になし

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

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

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

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

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

jimbe

2024/11/08 15:35 編集

何処に問題があるか分からない場合、コードの一部だけを出されても動かして確認することさえ出来ません。 言われている問題動作を確認出来るだけのコードやレイアウト・OSのバージョン等々、必要なものは全てご提示ください。 >プログレスで検索して組み込んでみた どのようなサイトの情報を参考にされたのか、URLをご提示頂けると良いかもしれません。
tanuki_

2024/11/12 01:16

ご回答ありがとうございます。 今後そのように致します。
guest

回答2

0

自己解決

ご教示頂いた回答を基に以下のように修正した所上手くいきました。

java

1 private void SearchData(){ 2 // プログレスの表示 3 mProgressDialog = new CustomProgressDialog(ReserveTimetableActivity.this); 4 mProgressDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 5 mProgressDialog.show(); 6 7 new Thread(new Runnable() { 8 @Override 9 public void run() { 10 //リスト更新 11 getData(storeCode); 12 mControlAdapter = new ControlAdapter(getApplicationContext(), mReserve, mReservationDataByDate); 13 runOnUiThread(new Runnable() { 14 @Override 15 public void run() { 16 mControlList.setAdapter(mControlAdapter); 17 Collections.sort(mReserve, itemComparator); 18 mControlAdapter.notifyDataSetChanged(); 19 20 // プログレスが表示されていれば閉じる 21 if (mProgressDialog != null && mProgressDialog.isShowing()) { 22 mProgressDialog.dismiss(); 23 } 24 } 25 }); 26 27 } 28 }).start(); 29 30 } 31

投稿2024/11/11 01:37

tanuki_

総合スコア39

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

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

0

おそらく

mProgressDialog.show();

でプログレスが表示されて

//リスト更新

で時間が掛かっている間プログレスが表示されていて処理が終わったらプログレスのダイアログを閉じる…とされたいのだと思いますが。

android は UI スレッドという単一のスレッドがアプリ全体の処理を行っていることはご理解されているでしょうか。

https://developer.android.com/guide/components/processes-and-threads?hl=ja#Threads

ダイアログ等の表示処理は実際には UI スレッドへの通知(処理要求)であって、実行したら即表示されるものではありません。
また View の操作によるイベントの発火もまた UI スレッドが処理していて、その場合イベントの処理が終わらない限り UI スレッドは次の処理は出来ません。
従って、もし SearchData の呼び出しがボタン操作等によるイベント処理メソッドからであれば、まさしく UI スレッド上で動いている状態であり、ダイアログの表示の要求は SearchData が終わらなければ実行されないことになります。
SearchData は表示・処理の後にダイアログを閉じるまで行っていますから、 SearchData が終わってダイアログを表示後即閉じとなり、結局何も起きていないような状態になるでしょう。

表ではプログレスが動き裏では更新処理が動くようにするというのであれば、マルチスレッドにする必要があると思います。
(参考にされた情報がどのようなものだったのかが気になります。)


取り合えずテキトウに想像しました。
(なお、ダイアログでプログレスを表示することはユーザが他の操作をすることを出来なくしてしまう可能性があるため推奨されません。)

MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.app.Dialog; 4import android.os.*; 5import android.view.*; 6import android.widget.*; 7 8import java.time.*; 9import java.util.*; 10import java.util.function.*; 11 12public class MainActivity extends AppCompatActivity { 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 ListView listView = findViewById(R.id.list_view); 19 Adapter adapter = new Adapter(); 20 listView.setAdapter(adapter); 21 22 EditText searchCodeEdit = findViewById(R.id.search_code); 23 Button searchButton = findViewById(R.id.search_button); 24 searchButton.setOnClickListener(e -> { 25 String storeCode = searchCodeEdit.getText().toString(); 26 new AsyncProgressDialog<>(null, ()->getData(storeCode), adapter::setItemList).show(); 27 }); 28 } 29 30 //時間のかかる処理を模倣 31 private List<Item> getData(String storeCode) { 32 String date = LocalDateTime.now().toString(); 33 int max = new Random().nextInt(10) + 3; //テキトウな数のデータを用意する 34 List<Item> list = new ArrayList<>(); 35 for(int i=0; i<max; i++) { 36 if(i != 0) { 37 try { 38 Thread.sleep(500); //[ms] 39 } catch(InterruptedException e) { 40 break; //中止 41 } 42 } 43 list.add(new Item(storeCode, (i+1)+" : "+date)); 44 } 45 return list; 46 } 47 48 private class AsyncProgressDialog<E> extends Dialog { 49 AsyncProgressDialog(Runnable pre, Supplier<E> back, Consumer<E> post) { 50 super(MainActivity.this); 51 setContentView(R.layout.dialog_progress); 52 53 setOnShowListener(d -> { 54 if(pre != null) { 55 try { 56 pre.run(); 57 } catch(Throwable t) { 58 dismiss(); 59 throw t; 60 } 61 } 62 new Thread(() -> { 63 try { 64 E v = back.get(); 65 runOnUiThread(() -> { 66 try { 67 if(post != null) post.accept(v); 68 } finally { 69 dismiss(); 70 } 71 }); 72 } catch(Throwable t) { 73 runOnUiThread(() -> dismiss()); 74 throw t; 75 } 76 }).start(); 77 }); 78 } 79 } 80 81 private static class Item { 82 final String code, text; 83 Item(String code, String text) { 84 this.code = code; 85 this.text = text; 86 } 87 } 88 89 private static class Adapter extends BaseAdapter { 90 private List<Item> itemList = new ArrayList<>(); 91 private Comparator<Item> itemComparator = Comparator.comparing(a -> a.code); 92 93 void setItemList(List<Item> itemList) { 94 this.itemList = new ArrayList<>(itemList); //防御コピー 95 Collections.sort(itemList, itemComparator); 96 notifyDataSetChanged(); 97 } 98 99 @Override 100 public int getCount() { 101 return itemList.size(); 102 } 103 104 @Override 105 public Object getItem(int position) { 106 return itemList.get(position); 107 } 108 109 @Override 110 public long getItemId(int position) { 111 return 0; 112 } 113 114 @Override 115 public View getView(int position, View convertView, ViewGroup parent) { 116 ViewHolder vh = convertView == null ? new ViewHolder(parent) : (ViewHolder)convertView.getTag(); 117 vh.bind(itemList.get(position)); 118 return vh.itemView; 119 } 120 121 private static class ViewHolder { 122 final View itemView; 123 private TextView text1, text2; 124 125 ViewHolder(ViewGroup parent) { 126 itemView = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2, parent, false); 127 itemView.setTag(this); 128 text1 = itemView.findViewById(android.R.id.text1); 129 text2 = itemView.findViewById(android.R.id.text2); 130 } 131 132 void bind(Item item) { 133 text1.setText(item.code); 134 text2.setText(item.text); 135 } 136 } 137 } 138}

layout/activity_main.xml

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/search_code_label" 11 android:layout_width="0dp" 12 android:layout_height="wrap_content" 13 android:text="CODE:" 14 app:layout_constraintStart_toStartOf="parent" 15 app:layout_constraintBaseline_toBaselineOf="@id/search_code" /> 16 <EditText 17 android:id="@+id/search_code" 18 android:layout_width="0dp" 19 android:layout_height="wrap_content" 20 app:layout_constraintEnd_toEndOf="parent" 21 app:layout_constraintStart_toEndOf="@id/search_code_label" 22 app:layout_constraintTop_toTopOf="parent" /> 23 <Button 24 android:id="@+id/search_button" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:text="search" 28 app:layout_constraintEnd_toEndOf="parent" 29 app:layout_constraintTop_toBottomOf="@id/search_code" /> 30 31 <ListView 32 android:id="@+id/list_view" 33 android:layout_width="0dp" 34 android:layout_height="0dp" 35 android:background="#d0ffff" 36 app:layout_constraintBottom_toBottomOf="parent" 37 app:layout_constraintEnd_toEndOf="parent" 38 app:layout_constraintStart_toStartOf="parent" 39 app:layout_constraintTop_toBottomOf="@id/search_button" /> 40</androidx.constraintlayout.widget.ConstraintLayout>

layout/dialog_progress.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 xmlns:app="http://schemas.android.com/apk/res-auto"> 6 7 <ProgressBar 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 app:layout_constraintBottom_toBottomOf="parent" 11 app:layout_constraintEnd_toEndOf="parent" 12 app:layout_constraintStart_toStartOf="parent" 13 app:layout_constraintTop_toTopOf="parent" /> 14</androidx.constraintlayout.widget.ConstraintLayout>

投稿2024/11/08 15:47

編集2024/11/10 08:34
jimbe

総合スコア13168

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問