Processing Bar waehrend App voll ausgelastet ist

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Processing Bar waehrend App voll ausgelastet ist

    Hallo ihr Lieben
    Ich habe folgendes Problem:
    Meine App berechnet etwas und ist dabei voll ausgelastet. Sol bleibt auch die Processing Bar stehen. Habt ihr eine Idee wie ich das loesen koennte? Versucht habe ich bisher AsynkTask.

    Mit freundlichen Gruessen
    Johannes
  • Das was hier in der Methode protected void onPreExecute() ausgefuehrt, laesst die App einfrieren, bis sie zuende gerechnet hat. Dann setzt die Processing Bar, aber an der Stelle als waehre sie die ganze Zeit gelaufen.

    Java-Quellcode

    1. package com.example.matrix.threads1;
    2. import android.Manifest;
    3. import android.content.DialogInterface;
    4. import android.content.pm.PackageManager;
    5. import android.os.AsyncTask;
    6. import android.support.annotation.NonNull;
    7. import android.support.v4.app.ActivityCompat;
    8. import android.support.v4.content.ContextCompat;
    9. import android.support.v7.app.AlertDialog;
    10. import android.support.v7.app.AppCompatActivity;
    11. import android.os.Bundle;
    12. import android.view.View;
    13. import android.widget.Button;
    14. import android.widget.ProgressBar;
    15. import android.widget.TextView;
    16. import android.widget.Toast;
    17. public class MainActivity extends AppCompatActivity {
    18. private ProgressBar bar1;
    19. private Button button1;
    20. private int STORAGE_PERMISSION_CODE = 1;
    21. @Override
    22. protected void onCreate(Bundle savedInstanceState) {
    23. super.onCreate(savedInstanceState);
    24. setContentView(R.layout.activity_main);
    25. bar1 = findViewById(R.id.bar1);
    26. button1 = findViewById(R.id.button1);
    27. button1.setOnClickListener(new View.OnClickListener() {
    28. @Override
    29. public void onClick(View v) {
    30. if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
    31. new Downlaoder().execute();
    32. double appOutput = Finish.ziel;
    33. TextView textview = findViewById(R.id.view);
    34. textview.setText(String.valueOf(appOutput));
    35. }
    36. else{
    37. requestStoragePermission();
    38. }
    39. }
    40. });
    41. }
    42. class Downlaoder extends AsyncTask<Void, Integer, Integer> {
    43. @Override
    44. protected void onPreExecute() {
    45. super.onPreExecute();
    46. FFT_Finish.absolut();
    47. Read_In.target();
    48. Finish.compute(16000, 90880, FFT_Finish.output);
    49. bar1.setMax(100);
    50. }
    51. @Override
    52. protected void onProgressUpdate(Integer... values) {
    53. super.onProgressUpdate(values);
    54. bar1.setProgress(values[0]);
    55. }
    56. @Override
    57. protected Integer doInBackground(Void... arg0) {
    58. for(int i=0;i<100;i++){
    59. publishProgress(i);
    60. try {
    61. Thread.sleep(100);
    62. }
    63. catch (InterruptedException ie){
    64. ie.printStackTrace();
    65. }
    66. }
    67. return null;
    68. }
    69. @Override
    70. protected void onPostExecute(Integer result) {
    71. super.onPostExecute(result);
    72. Toast.makeText(getApplicationContext(), "Download Finished", Toast.LENGTH_LONG).show();
    73. }
    74. }
    75. private void requestStoragePermission(){
    76. if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)){
    77. new AlertDialog.Builder(this).setTitle("Permission needed").setMessage("You must allow the Permission to run the App\n\nAfter this, please enter the Button again").setPositiveButton("ok", new DialogInterface.OnClickListener() {
    78. @Override
    79. public void onClick(DialogInterface dialog, int which) {
    80. ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
    81. }
    82. })
    83. .setNegativeButton("cancle", new DialogInterface.OnClickListener() {
    84. @Override
    85. public void onClick(DialogInterface dialog, int which) {
    86. dialog.dismiss();
    87. }
    88. })
    89. .create().show();
    90. }
    91. else{
    92. ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
    93. }
    94. }
    95. @Override
    96. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    97. if(requestCode == STORAGE_PERMISSION_CODE){
    98. if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
    99. Toast.makeText(this, "Permission GRANTED", Toast.LENGTH_SHORT).show();
    100. }
    101. else{
    102. Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show();
    103. }
    104. }
    105. }
    106. }
    Alles anzeigen
  • also ich würde sagen das du gar nicht zur Zeile 36 kommst und somit deinen Task startest.
    Die Abfrage nach der Permission ist bestimmt negativ.
    Ansonsten läuft eigentlich der Thread. Die Progressbar hast du bestimmt immer sichtbar im Layout.
    Wenn dem so ist musst du sie auch wieder unsichtbar machen .
    Ich blende das immer als Dialog ein und beende den Dialog in der onPostExecute .


    Was ist eigentlich das

    Quellcode

    1. FFT_Finish.absolut();
    2. Read_In.target();
    3. Finish.compute(16000, 90880, FFT_Finish.output);


    Wenn das deine eigentliche berechnung ist gehört die in die on doInBackground .
    Die onPreExecute() läuft im UI Thread



    Das was hier in der Methode protected void onPreExecute() ausgefuehrt, laesst die App einfrieren
    Kein wunder die läuft im UI Thread der Thread ist die doInBackgound.

    big-app.de/asynctask-zur-entlastung-des-main-threads/
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von jogimuc ()

  • Vielen Dank. Das hat mir schonmal sehr geholfen. Das Problem ist jetzt noch, dass wenn ich dieses Berechnungen vor die for Schleife setze, die Process Bar erst anfaengt, wenn die Berechnungen fertig sind. Genau andersherum wenn ich sie hinter die for Schleife setze. ich moechte aber, dass sie gleichzeitig ablaufen, denn die Berechnung dauer ca. 10 Sekunden.

    MfG Johannes
  • Es war mir klar das du es selber bist.

    Ok dann versuche ich es mal.

    Also eigentlich ist das mit der for schleife , bestimmt nur ein Beispiel um einen thread eine Aufgabe zu geben.

    normalerweise solltest du in deinem zeitaufwendigen Code selber etwas finden was du als Status Anzeige verwenden kannst. zb bei einem Download die Menge der runtergeladen Daten. Um daraus den Fortschrittes Balken anzuzeigen.

    Die for Schleife brauchst du nicht ist mit sicherheit aus dem Beispiel das du zur Grundlage genommen hast.
    Ein Feedback auf Tipps ist auch schön. :P