Android Task Tracker Async onProgressUpdate

I am a new programmer. I've seen a lot of tutorials but can't figure out what is wrong. I am trying to create a ProgressBar from an Async task. However, it always crashes my application.

Here's the main application:

package pt.flag.ensemble;

import java.util.Random;

import pt.flag.ensemble.task.AsyncTaskBar;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Toast;

public class Intervals extends Activity {

    private static Intervals instance;
    private Context context;
    private String answer;
    int right_question;
    int wrong_question;
    int randomInt2;
    public ProgressBar progressBar;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intervals);

        // initializing the sounds
        final MediaPlayer sound1 = MediaPlayer.create(Intervals.this,
                R.raw.maj2);
        final MediaPlayer sound2 = MediaPlayer.create(Intervals.this,
                R.raw.maj3);
        final MediaPlayer sound3 = MediaPlayer.create(Intervals.this,
                R.raw.maj4);

        //ProgressBar
        instance=this;
        ProgressBar progressBar = (ProgressBar) findViewById(R.id.Progressbar);
        progressBar.setProgress(0);


        // Play Methods
        final ImageButton Play = (ImageButton) findViewById(R.id.Play);
        Play.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                new AsyncTaskBar().execute();
                Play.setEnabled(false);
                // generate random number
                Random randomGenerator = new Random();
                int randomInt = randomGenerator.nextInt(3) + 1;
                randomInt2 = randomInt;



                // picking the right sound to play
                    switch (randomInt) {
                    case 1:
                        sound1.start();
                        answer = "M2";
                        break;
                    case 2:
                        sound2.start();
                        answer = "M3";
                        break;
                    case 3:
                        sound3.start();
                        answer = "P4";
                        break;
                    }

            }
        });

        //Audio Repeat Methods
        Button Repeat = (Button) findViewById(R.id.Repeat);
        Repeat.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {



                    // picking the right sound to play
                    switch (randomInt2) {
                    case 1:
                        sound1.start();
                        new AsyncTaskBar().execute();
                        answer = "M2";
                        break;
                    case 2:
                        sound2.start();
                        new AsyncTaskBar().execute();
                        answer = "M3";
                        break;
                    case 3:
                        sound3.start();
                        new AsyncTaskBar().execute();
                        answer = "P4";
                        break;
                    }


            }
        });
    }

    //Answering Methods
    public void buttonClicked2(View view) {
        Button clickedButton = (Button) view;
        if (clickedButton.getText().toString().equals(answer)) {
            Toast.makeText(Intervals.this, "You are Right!", Toast.LENGTH_LONG)
                    .show();

            right_question = right_question + 1;


            final ImageButton Play = (ImageButton) findViewById(R.id.Play);
            Play.setEnabled(true);

            // Passing results through
            SharedPreferences sharedPref = getSharedPreferences(
                    "INTERVALRIGHTS", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putInt("SCORE", right_question);
            editor.commit();

        } else {
            Toast.makeText(Intervals.this, "You are Wrong!", Toast.LENGTH_LONG)
                    .show();

            wrong_question = wrong_question + 1;

            // Passing results through
            SharedPreferences sharedPref02 = getSharedPreferences(
                    "INTERVALWRONGS", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref02.edit();
            editor.putInt("SCORE02", wrong_question);
            editor.commit();

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.intervals, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
        case R.id.action_settings:
            Intent intent = new Intent(Intervals.this, IntervalResults.class);
            startActivity(intent);
            break;
        default:
            return super.onOptionsItemSelected(item);
        }
        return true;
    }

        public static Intervals getApp() { return instance; }
}

      

Here is the AsyncTask class

package pt.flag.eventapp.task;

import pt.flag.eventapp.Main;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.widget.Toast;

public class ShowDialogAsyncTask extends AsyncTask<Void, Integer, Void> {
    int progress_status;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        //Toast.makeText(Main.getApp(),"Invoke on PreExecute()", Toast.LENGTH_SHORT).show();
        progress_status = 0 ;
        //Main.getApp().txt_percentage.setText("downloading 0%");
    }

    @Override
    protected Void doInBackground(Void... params) {
        while (progress_status < 100){
            progress_status +=2;
            publishProgress(progress_status);
            SystemClock.sleep(300);
        }
        return null;
    }
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        //Main.getApp().progressBar.setProgress(values[0]);
        //Main.getApp().txt_percentage.setText("downloading" + values[0] + "%");
}
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        //Toast.makeText(Main.getApp(), "Invoke onPostExecute()", Toast.LENGTH_SHORT).show();
        //Main.getApp().txt_percentage.setText("download complete");
    }
}

      

Here is the log:

08-10 20:38:11.081: E/AndroidRuntime(21441): FATAL EXCEPTION: main
08-10 20:38:11.081: E/AndroidRuntime(21441): java.lang.NullPointerException
08-10 20:38:11.081: E/AndroidRuntime(21441):    at pt.flag.ensemble.task.AsyncTaskBar.onProgressUpdate(AsyncTaskBar.java:34)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at pt.flag.ensemble.task.AsyncTaskBar.onProgressUpdate(AsyncTaskBar.java:1)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:618)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at android.os.Looper.loop(Looper.java:156)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at android.app.ActivityThread.main(ActivityThread.java:4977)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at java.lang.reflect.Method.invokeNative(Native Method)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at java.lang.reflect.Method.invoke(Method.java:511)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-10 20:38:11.081: E/AndroidRuntime(21441):    at dalvik.system.NativeStart.main(Native Method)

      

If I'm correct, the log seems to indicate an error on line 34 in the AsyncTask class, which is "Intervals.getApp (). ProgressBar.setProgress (values โ€‹โ€‹[0]); I just don't know why ...

Also, here is my xml file

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageButton
        android:id="@+id/Play"
        android:contentDescription="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:layout_marginTop="50dp"
        android:layout_marginLeft="50dp" />

    <Button
        android:id="@+id/Repeat"
        android:contentDescription="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Repeat"
        android:layout_marginTop ="50dp"
        android:layout_toRightOf="@+id/Play"
        android:layout_marginLeft="25dp" />

      <ProgressBar
        android:id="@+id/Progressbar"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="test"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/Play" />

    <Button
        android:id="@+id/Octave_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_marginLeft="5dp"
        android:layout_below="@+id/Progressbar"
        android:onClick="buttonClicked2"
        android:layout_marginTop="100dp" 
        android:text="@string/octave" />

    <Button
        android:id="@+id/min2_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Progressbar"
        android:onClick="buttonClicked2"
        android:layout_marginTop="100dp" 
        android:layout_toRightOf="@+id/Octave_Button"
        android:text="@string/minor2" />

    <Button
        android:id="@+id/Maj2_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Progressbar"
        android:onClick="buttonClicked2"
        android:layout_marginTop="100dp" 
        android:layout_toRightOf="@+id/min2_Button"
        android:text="@string/major2" />

    <Button
        android:id="@+id/min3_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Progressbar"
        android:onClick="buttonClicked2"
        android:layout_marginTop="100dp" 
        android:layout_toRightOf="@+id/Maj2_Button"
        android:text="@string/minor3" />

    <Button
        android:id="@+id/Maj3_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Progressbar"
        android:onClick="buttonClicked2"
        android:layout_marginTop="100dp" 
        android:layout_toRightOf="@+id/min3_Button"
        android:text="@string/major3" />

    <Button
        android:id="@+id/P4_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Progressbar"
        android:onClick="buttonClicked2"
        android:layout_marginTop="100dp" 
        android:layout_toRightOf="@+id/Maj3_Button"
        android:text="@string/perfect4" />



    <Button
        android:id="@+id/A4_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Octave_Button"
        android:onClick="buttonClicked2"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="5dp"
        android:text="@string/tritone" />

    <Button
        android:id="@+id/P5_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/min2_Button"
        android:onClick="buttonClicked2"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@+id/A4_Button"
        android:text="@string/perfect5" />

    <Button
        android:id="@+id/minor6_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Maj2_Button"
        android:onClick="buttonClicked2"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@+id/P5_Button"
        android:text="@string/minor6" />

     <Button
        android:id="@+id/Major6_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/min3_Button"
        android:onClick="buttonClicked2"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@+id/minor6_Button"
        android:text="@string/major6" />

    <Button
        android:id="@+id/minor7_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/Maj3_Button"
        android:onClick="buttonClicked2"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@+id/Major6_Button"
        android:text="@string/minor7" />


    <Button
        android:id="@+id/Major7_Button"
        android:layout_width="52dp"
        android:layout_height="80dp"
        android:layout_below="@+id/P4_Button"
        android:onClick="buttonClicked2"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@+id/minor7_Button"
        android:text="@string/major7" />

      

+3


source to share


3 answers


I think it's better if you pass the progress bar as an argument to AsyncTask

:

final ProgressBar progressBar = (ProgressBar) findViewById(R.id.Progressbar);
progressBar.setProgress(0);

// Play Methods
final ImageButton Play = (ImageButton) findViewById(R.id.Play);
Play.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        AsyncTaskBar task = new AsyncTaskBar();
        task.setProgressBar(progressBar);
        task.execute();
    }

      

And then AsyncTask

declare the method setProgressBar

:

public class ShowDialogAsyncTask extends AsyncTask<Void, Integer, Void> {

ProgressBar bar;

public void setProgressBar(ProgressBar bar) {
    this.bar = bar;
}

@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    if (this.bar != null) {
        bar.setProgress(values[0]);
    }
}

      

You can do the same with the TextView

one you are trying to install.



Anyway, since you mentioned that you are new to this, you might want to take a look at the Broadcast / Receiver template. Here's how it's done:

  • Run the async task without setting a progress bar or whatever.
  • Define BroadcastReceiver

    , instantiate in your activity and register / unregister.
  • Whenever there is a progress update in your asynchronous task, just call sendBroadcast with the progress update as an additional intent. You may need to pass a context parameter when instantiating AsyncTask.
  • Your application's onHandleIntent method (the one you created in step 2) will run on the UI thread, making all these UI updates safe.

Sounds a little overwhelming? That's at first, but here are the benefits:

  • It's much cleaner than passing UI objects to AsyncTask.
  • You will learn a powerful Android pattern that comes in handy in other endeavors.
  • This will save you a lot of hassle (and exceptions) if you switch context or your application gets low in memory.
+4


source


Intervals.getApp().progressBar.setProgress(values[0]);

      

This line of code has two possibilities for NullPointerException

:

  • getApp()

    returns null

  • progressBar

    null



To determine what the reason is, you need to break it down into two separate lines:

Intervals intervals = Intervales.getApp();
intervals.progressBar.setProgress(values[0]);

      

Now set a breakpoint on the first line, go to it and determine if there is intervals

null

or not.

+1


source


progressBar is a local variable, while you are referring to the variable of the same name of another class-object (in your case, to the application object). you are probably confusing them.

-1


source







All Articles