AsyncTask: passing Activity value (onCreate method)

Update1

activity:

public Integer _number = 0;
@Override
    public void onCreate(Bundle savedInstanceState) {
if (_number >0)
        {
            Log.d("onSuccessfulExecute", ""+_number);
        }
        else
        {
            Log.d("onSuccessfulExecute", "nope empty songs lists");
        }
}

public int onSuccessfulExecute(int numberOfSongList) {

_number = numberOfSongList;

if (numberOfSongList >0)
{
    Log.d("onSuccessfulExecute", ""+numberOfSongList);
}
else
{
    Log.d("onSuccessfulExecute", "nope empty songs lists");
}
    return numberOfSongList;
}

      

end Update1

UPDATE: AsynchTask has its own outer class.

How to pass value from AsyncTask onPostExecute () ... to action

my code is returning the return value from onPostExecute () and updating in the UI, but I'm looking for a way to set the activity ( NumberOfSongList

) variable coming from the AsynchTask.

AsyncTask class:

@Override
    public void onPostExecute(asynctask.Payload payload)
    {  
         AsyncTemplateActivity app = (AsyncTemplateActivity) payload.data[0];

             //the below code DOES UPDATE the UI textView control
             int answer = ((Integer) payload.result).intValue();
             app.taskStatus.setText("Success: answer = "+answer);

            //PROBLEM:
            //i am trying to populate the value to an variable but does not seems like the way i am            doing:
            app.NumberOfSongList = payload.answer;
            ..............
            ..............
    }

      

Activity:

  public Integer NumberOfSongList;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 

        //Several UI Code   
        new ConnectingTask().execute();
        Log.d("onCreate", ""+NumberOfSongList);

    } 

      

+3


source to share


3 answers


How about using a setter method? eg.

private int _number;
public int setNumber(int number) {
    _number = number;
}

      

UPDATE:

Take a look at this code. This will do what you are trying to accomplish.



Action class

public class TestActivity extends Activity {
    public int Number;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test);

        Button btnDisplay = (Button) findViewById(R.id.btnDisplay);
        btnDisplay.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Toast toast = Toast.makeText(v.getContext(), "Generated number: " + String.valueOf(Number), Toast.LENGTH_LONG);
                toast.show();               
            }
        });

        new TestTask(this).execute();
    }
}

      

AsyncTask class

public class TestTask extends AsyncTask<Void, Void, Integer> {
    private final Context _context;
    private final String TAG = "TestTask";
    private final Random _rnd;

    public TestTask(Context context){
        _context = context;
        _rnd = new Random();
    }

    @Override
    protected void onPreExecute() {
        //TODO: Do task init.
        super.onPreExecute();
    }

    @Override
    protected Integer doInBackground(Void... params) {
        //Simulate a long-running procedure.
        try {
            Thread.sleep(3000);         
        } catch (InterruptedException e) {
            Log.e(TAG, e.getMessage());
        }

        return _rnd.nextInt();
    }

    @Override
    protected void onPostExecute(Integer result) {
        TestActivity test = (TestActivity) _context;
        test.Number = result;       
        super.onPostExecute(result);
    }
}

      

+2


source


Just a caveat: be very careful when trying to save a reference to an Activity instance in an AsyncTask - I found this the hard way :). If a user rotates the device while a background task is running, your activity will be destroyed and recreated, invalidating the activity link.



+1


source


Create a listener.

Create a new class file. Called something like MyAsyncListener and makes it look like this:

 public interface MyAsyncListener() {
      onSuccessfulExecute(int numberOfSongList);
 }

      

Make your activity an implementation of MyAsyncListener, i.e.

 public class myActivity extends Activity implements MyAsyncListener {

      

Add a listener to the constructor for your AsyncTask and set it to a global var in the Async class. Then call the listener method on onPostExecute and pass the data.

 public class MyCustomAsync extends AsyncTask<Void,Void,Void> {

      MyAsyncListener mal;

      public MyCustomAsync(MyAsyncListener listener) {
           this.mal = listener;
      }

      @Override
      public void onPostExecute(asynctask.Payload payload) {
           \\update UI
           mal.onSuccessfulExecute(int numberOfSongList);
      }
 }

      

Now, whenever your AsyncTask is complete, it will call the onSuccessfulExecute method in your Activity class, which should look like this:

 @Override
 public void onSuccessfulExecute(int numberOfSongList) {
      \\do whatever
 }

      

Good luck.

0


source







All Articles