Search code examples
javaandroidandroid-asynctasktoastandroid-2.3-gingerbread

Android: toast inside AsyncTask


I have an AsyncTask class SearchForQuestions that is called from an Activity QuizMap. When looping through an array in SearchForQuestions I can't find the correct context for toast to appear within the AsynTask.

The standard Toast.makeText(getApplicationContext(), "This is Toast!!!", Toast.LENGTH_SHORT).show(); gives error getApplicationContext() undefined.

I have tried some of the solutions to this offerred by SO, most of them are listed here and concern getting UiThread and running on that.

I can't get this to work however. Here's example code snippets of what i have tried. I have put a method in QuizMap and try calling it from SearchForQuestions but SearchForQuestions isn't recognised. How can I get around this? )Still a newbie at java...)

// QuizMap activity

public class QuizMap extends FragmentActivity 
implements OnMarkerClickListener {

private GoogleMap map;

private static final String TAG = "QuizMap"; // debugging
...

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_quizmap);
     map = ((SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map))
               .getMap();
...
}

    // make toast inside AsyncTask
public void showNotNearToast(final String toast) {
    QuizMap.this.runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(QuizMap.this, "This is Toast!!!", Toast.LENGTH_SHORT).show();

        }});
}

.

// SearchForQuestions class
private class SearchForQuestions extends AsyncTask<String, Void, DataHandler> {
    // checks for proximity to question locations

    Location location = 
            locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    @Override
    protected DataHandler doInBackground(String... pointsList) {
        String result = pointsList[0];
        ...
}

    @Override
    protected void onPostExecute(DataHandler result) {

        ArrayList<String> resultsArray = result.results;
        Integer numPoints = resultsArray.size();
        for (int i =0;i<numPoints;i++){

            String[] pointDetails = resultsArray.get(i).split("::");
            ...

            // we can make use of the Android distanceTo function to calculate the distances
            float distance = location.distanceTo(fixedLoc);

            if (i > DIST) { // this is UCL

                showNotNearToast("My Message"); // showNotNearToast undefined 


                if (distance < DIST) {

             ...
                 }
                    };

Solution

  • I'm going t close this question. I haven't solved my problem but the number of answers provided that apparently work in other situations suggest there's something else going on. I'm going to re-structure the classes to get around having to call from within AsyncTask.