アプリケーションをフリーズせずにUIスレッドを更新する

Reaperino

コードに問題があります。Androidの世界は初めてで、AsyncTaskクラスのサポートが必要です...

CSVファイルの行を検索するメソッドがあります。次に、追加するビューと追加する順序を示すマップのおかげで、見つかった行の数に関して、TableLayoutに特定の行を追加することになっています。

この方法は私が望むように機能していますが、問題はコンピューティングが原因でアプリケーションがフリーズしているため、何かが起こっていることをユーザーに示すために何かをしたいと思っています。

AsyncTaskの使用について何か読んだのですが、AsyncTaskがバックグラウンドスレッドでコンピューティングを行っており、バックグラウンドスレッドを介してUIを更新できないことを知っています。

あなたが私を理解してくれることを願っています(私はフランス語なので、私の英語はおおよそです^^)

これが私のコードです:

private void addModifLinesToView(TableLayout view, String ressource, Map<String,Object> ViewVal, List<List<View>> listeViews) throws IOException {
    try {
        CSVFile csvBT = new CSVFile(new FileInputStream(Environment.getExternalStorageDirectory()+"/"+folder_main+"/"+imported_data+"/"+ressource));
        List<String[]> tableauVals = csvBT.findLines(indicePoste.getText().toString());
        int numLigne = 0;

        //pour chaque ligne trouvée dans le csv
        for (String[] s : tableauVals) {
            numLigne++;
            if (view.getId() == tableauBT.getId())
            {
                numLigneBT++;
            }
            List<View> actualViews = new ArrayList<>();
            List<View> dividers = new ArrayList<>();
            TableRow row = new TableRow(getApplicationContext());
            row.setLayoutParams(new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.MATCH_PARENT,
                    TableLayout.LayoutParams.WRAP_CONTENT));

            //creation des separateurs
            for (int i = 0; i < ViewVal.size()+1; i++) {
                View divider = new View(getApplicationContext());
                divider.setLayoutParams(new TableLayout.LayoutParams(
                        TableLayout.LayoutParams.MATCH_PARENT,
                        TableLayout.LayoutParams.MATCH_PARENT));
                divider.setBackgroundColor(Color.BLACK);
                dividers.add(divider);
            }

            //delimiter a gauche de la ligne
            row.addView(dividers.get(0),
                    new TableRow.LayoutParams(
                            TableRow.LayoutParams.MATCH_PARENT,
                            TableRow.LayoutParams.MATCH_PARENT));

            ArrayList<String> listeModeles;

            for ( Map.Entry<String,Object> entry : ViewVal.entrySet()) {
                if (entry.getKey().contains("EditText")) {
                    EditText et = new EditText(getApplicationContext());
                    actualViews.add(et);
                    et.setMaxWidth(0);
                    et.getBackground().mutate().setColorFilter(getResources().getColor(android.R.color.darker_gray), PorterDuff.Mode.SRC_ATOP);
                    et.setHighlightColor(getResources().getColor(R.color.gris));
                    et.setPadding(3, 3, 3, 7);
                    et.setGravity(Gravity.CENTER);
                    et.setTextColor(Color.BLACK);
                    et.setSingleLine();
                    et.setInputType((int) entry.getValue());
                    et.setImeOptions(EditorInfo.IME_ACTION_DONE);
                    //pour mettre la taiile du text en SP
                    et.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
                } else if (entry.getKey().contains("Spinner")) {
                    Spinner spin = new Spinner(getApplicationContext());
                    actualViews.add(spin);
                    spin.getBackground().setColorFilter(getResources().getColor(R.color.noir), PorterDuff.Mode.SRC_ATOP);
                    spin.setPadding(3, 3, 3, 3);
                    spin.setGravity(Gravity.CENTER);
                    spin.setPopupBackgroundResource(R.color.blanc);
                    ByteArrayInputStream bais = new ByteArrayInputStream((byte[])entry.getValue());
                    listeModeles = listerModeles(bais);
                    ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_item, listeModeles);
                    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spin.setAdapter(adapter);
                } else if (entry.getKey().contains("TextView"))
                {
                    TextView tv = new TextView(getApplicationContext());
                    actualViews.add(tv);
                    tv.setText(Integer.toString(numLigne));
                    tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
                    tv.setMaxWidth(0);
                    tv.setPadding(3, 3, 3, 7);
                    tv.setGravity(Gravity.CENTER);
                    tv.setTextColor(Color.BLACK);
                    tv.setSingleLine();
                }
            }

            for (int j = 0; j < actualViews.size(); j++) {
                row.addView(actualViews.get(j),
                        new TableRow.LayoutParams(
                                TableRow.LayoutParams.MATCH_PARENT,
                                TableRow.LayoutParams.MATCH_PARENT, 1f));
                row.addView(dividers.get(j + 1),
                        new TableRow.LayoutParams(
                                TableRow.LayoutParams.MATCH_PARENT,
                                TableRow.LayoutParams.MATCH_PARENT));
            }

            view.addView(row);
            //separateur horizontal
            View dividerH = new View(getApplicationContext());
            dividerH.setLayoutParams(new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.MATCH_PARENT,
                    3));
            dividerH.setBackgroundColor(Color.BLACK);
            view.addView(dividerH, new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.MATCH_PARENT,
                    3));
            listeViews.add(actualViews);
        }
    }
    catch (ArrayIndexOutOfBoundsException | FileNotFoundException e) {
        e.printStackTrace();
    }
}
matheszabi

ドキュメント確認してください。例もあります。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

メソッドaddModifLinesToViewはから呼び出す必要がありますdoInBackground必要なのはpublishProgress呼び出しを追加することだけです。そのメソッドで、処理しているファイルをユーザーに表示できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アプリケーションをフリーズせずにTextViewを更新する

分類Dev

Java-BlockingQueueがマルチスレッドアプリケーションをフリーズする

分類Dev

スレッド/アプリケーションをフリーズせずにメソッドの実行を遅くするにはどうすればよいですか?

分類Dev

winformsアプリケーションのUIスレッドを確実に更新します

分類Dev

サーバーを終了/再起動せずに[コード] Webアプリケーションを更新する

分類Dev

UIスレッドをフリーズせずにゲームループを実装する最良の方法

分類Dev

アプリケーションを再起動せずにSQLiteデータベースを更新する

分類Dev

スクロールせずに特定の値を更新するコンソールアプリケーション

分類Dev

GUIのフリーズを回避するためにpygtkアプリケーションでマルチスレッドを使用する

分類Dev

アプリケーションファイルをすべてのプロジェクトディレクトリにコピーアンドペーストせずにSQLiteをセットアップする

分類Dev

intelliJIDEAを使用せずにActフレームワークアプリケーションを実行する方法

分類Dev

既存のデータを削除せずにベスパアプリケーションを更新する

分類Dev

アプリケーションを再起動せずに、アプリケーションパレットのランタイムを変更する

分類Dev

Windowsフォームを使用せずにリモートデスクトップクライアントアプリケーションを作成する(C#)

分類Dev

UIスレッドをフリーズせずにイベントハンドラーを遅延させる

分類Dev

スレッド化:Thread.Join()を使用した後にアプリケーションがフリーズする

分類Dev

マルチスレッドの使用中にアプリケーションが予期せず終了する

分類Dev

親(アプリケーション)ルートを更新せずに現在のルートを更新する方法

分類Dev

アプリケーション全体を更新せずに、光沢のあるアプリケーションのデータを更新する

分類Dev

アプリケーション内のデータを更新する方法はありますか?アプリケーション全体を更新せずに?

分類Dev

Spring Boot、アプリケーションを再起動せずにフロントエンドを更新

分類Dev

スタートアップ アプリケーションに UI アプリケーションを追加する Linux コマンド

分類Dev

更新せずにリアルタイムでデータを受信するアプリケーション

分類Dev

ctrl-cを使用せずにフラスコアプリケーションを停止する方法

分類Dev

ctrl-cを使用せずにフラスコアプリケーションを停止する方法

分類Dev

新しいAPKをインストールせずにアプリケーションを更新します

分類Dev

アプリケーションが計算を行っているときにUIがフリーズする

分類Dev

Xamarinフォームがデバッグせず、ZXingがすべてのアプリケーションをフリーズする

分類Dev

JavaFXアプリケーションスレッドが遅くなり、その後フリーズする

Related 関連記事

  1. 1

    アプリケーションをフリーズせずにTextViewを更新する

  2. 2

    Java-BlockingQueueがマルチスレッドアプリケーションをフリーズする

  3. 3

    スレッド/アプリケーションをフリーズせずにメソッドの実行を遅くするにはどうすればよいですか?

  4. 4

    winformsアプリケーションのUIスレッドを確実に更新します

  5. 5

    サーバーを終了/再起動せずに[コード] Webアプリケーションを更新する

  6. 6

    UIスレッドをフリーズせずにゲームループを実装する最良の方法

  7. 7

    アプリケーションを再起動せずにSQLiteデータベースを更新する

  8. 8

    スクロールせずに特定の値を更新するコンソールアプリケーション

  9. 9

    GUIのフリーズを回避するためにpygtkアプリケーションでマルチスレッドを使用する

  10. 10

    アプリケーションファイルをすべてのプロジェクトディレクトリにコピーアンドペーストせずにSQLiteをセットアップする

  11. 11

    intelliJIDEAを使用せずにActフレームワークアプリケーションを実行する方法

  12. 12

    既存のデータを削除せずにベスパアプリケーションを更新する

  13. 13

    アプリケーションを再起動せずに、アプリケーションパレットのランタイムを変更する

  14. 14

    Windowsフォームを使用せずにリモートデスクトップクライアントアプリケーションを作成する(C#)

  15. 15

    UIスレッドをフリーズせずにイベントハンドラーを遅延させる

  16. 16

    スレッド化:Thread.Join()を使用した後にアプリケーションがフリーズする

  17. 17

    マルチスレッドの使用中にアプリケーションが予期せず終了する

  18. 18

    親(アプリケーション)ルートを更新せずに現在のルートを更新する方法

  19. 19

    アプリケーション全体を更新せずに、光沢のあるアプリケーションのデータを更新する

  20. 20

    アプリケーション内のデータを更新する方法はありますか?アプリケーション全体を更新せずに?

  21. 21

    Spring Boot、アプリケーションを再起動せずにフロントエンドを更新

  22. 22

    スタートアップ アプリケーションに UI アプリケーションを追加する Linux コマンド

  23. 23

    更新せずにリアルタイムでデータを受信するアプリケーション

  24. 24

    ctrl-cを使用せずにフラスコアプリケーションを停止する方法

  25. 25

    ctrl-cを使用せずにフラスコアプリケーションを停止する方法

  26. 26

    新しいAPKをインストールせずにアプリケーションを更新します

  27. 27

    アプリケーションが計算を行っているときにUIがフリーズする

  28. 28

    Xamarinフォームがデバッグせず、ZXingがすべてのアプリケーションをフリーズする

  29. 29

    JavaFXアプリケーションスレッドが遅くなり、その後フリーズする

ホットタグ

アーカイブ