2

У меня есть класс AsyncTask SearchForQuestions, который вызывается из Activity QuizMap. При переходе через массив в SearchForQuestions я не могу найти правильный контекст для тоста, который появится в AsynTask.Android: тост внутри AsyncTask

Стандарт Toast.makeText(getApplicationContext(), "This is Toast!!!", Toast.LENGTH_SHORT).show(); дает ошибку getApplicationContext() undefined.

Я пробовал некоторые из решений этого предложения SO, большинство из них перечислены here и беспокоиться о получении UiThread и запуске на этом.

Я не могу заставить это работать. Вот пример фрагментов кода того, что я пробовал. Я поместил метод в QuizMap и попробую назвать его с SearchForQuestions, но SearchForQuestions не распознается. Как я могу обойти это?) Все еще новичок в 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) { 

      ... 
       } 
        }; 
+0

В чем вопрос? Связано ли это с Toast или 'SearchForQuestion'? – Froyo

+0

См. Мое редактирование. 'Toast.makeText (getApplicationContext(),« Это Toast !!! », Toast.LENGTH_SHORT) .show();' не работает внутри AsyncTask. – mark

+0

http://stackoverflow.com/a/12897386/4428462 – JonasCz

ответ

1

Я собираюсь т закрыть этот вопрос. Я не решил свою проблему, но количество ответов, которые, по-видимому, работают в других ситуациях, предполагает, что происходит что-то еще. Я собираюсь переструктурировать классы, чтобы обойти вызов из AsyncTask.

-2

Провести деятельность в AsyncTask. Смотри ниже.

private class SearchForQuestions extends AsyncTask<String, Void, DataHandler> { 
    Activity activity; 
    public void SearchForQuestions(Activity activity){ 
     this.activity = activity; 
    } 
//... rest of the code 

public class QuizMap extends FragmentActivity implements OnMarkerClickListener { 
    /*...*/ 
    new SearchForQuestions(this).execute(); 
    /*...*/ 
    /*When calling the toast:*/ 
Toast.makeText(this.activity, "This is Toast!!!", Toast.LENGTH_SHORT).show(); 
+0

Это просто плохо. Вам не нужно пропускать активность. Это утечка, если вы закроете приложение. – Froyo

+0

Я предлагаю [Обработчик] (http://developer.android.com/reference/android/ os/Handler.html) или [BroadcastListener] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) –

+0

@Froyo Я получил свой ответ отсюда: http://stackoverflow.com/ у a/4538370/2363810 есть много upvotes там – Val

0

Просто Toast это, почему вы хотите создать функцию для этого? onPostExecute() уже находится в потоке пользовательского интерфейса.

Вы не можете получить доступ, потому что внутренний класс не может вызывать функции класса Outer, если вы не передадите экземпляр внешнего класса.

+0

См. мое редактирование. Toast.makeText (getApplicationContext(), «Это тост !!!», Toast.LENGTH_SHORT) .show(); 'doesn Не работает внутри AsyncTask. – mark

+0

AFAICS OP может вызывать родительский класса, потому что он использует внутренний не вложенный ('статический') класс. Странно, но это не определено. –

0
  1. Позвоните своему тост в onPostExecute
  2. Создайте интерфейс для обратного вызова.

public interface ToastCallback { 
    public void invoke(String text); 
} 

Ваш AsyncTask конструктор

private ToastCallback toastCallback; 
public SearchQuestions(ToastCallback callback) { 
    this.toastCallback = callback; 
} 

// in doInBackground() { 

     toastCallback.invoke("Toast from background"); 
} 

в Вашей деятельности,

private void showNotNearToast(String text) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

public class MyToastCallback implements ToastCallback { 
    @Override 
    public void invoke(String text) { 
     showNotNearToast(text); 
    } 
} 

// Asynctask call 
new SearchQuestion(new MyTosatCallback()).execute(<Your params here>); 
+0

Итак, public void showNotNearToast (... ',' public interface ToastCallback {... 'и' public class MyToastCallback реализует ToastCallback {... 'в' QuizMap' и 'private void showNotNearToast (String text) {. ..'. 'public class MyToastCallback реализует ToastCallback {...' и 'new SearchQuestion (new ...' go in 'onPostExecute'? – mark

+0

с использованием кодов мест размещения, которые я указал выше' new SearchQuestion (новый MyToastCallback' не может быть разрешен к типу – mark

+0

Вы должны поместить интерфейс в другой файл. 'showNotNearToast' и' MyToastCallback class' идут в вашем классе Activity. – Froyo

0

Попробуйте внутри вашего AsyncTask:

myActivity.this.runOnUiThread(new Runnable() { 
    public void run() { 
     Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show(); 
    } 
}); 

Где у вас есть

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

Заменить myActivity с именем вашей деятельности.

+0

Размещение 'myActivity.this.runOnUiThread (новый ...' чуть выше 'showNotNearToast (« Мое сообщение »);' дает 'QuizMap.this': нет ограничений экземпляр типа QuizMap доступен в области – mark

0

(Ab) использует метод publishProgress

private class ToastAsyncTask extends AsyncTask<Void, String, Void>{ 
     @Override 
     protected Void doInBackground(Void... voids) { 
      SystemClock.sleep(1000); 
      publishProgress("Toast msg string"); 
      SystemClock.sleep(1000); 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      Toast.makeText(getApplicationContext(), values[0], Toast.LENGTH_SHORT).show(); 
     } 
    } 

** UPDATE **, так как у вас возникли проблемы с контекстом по какой-то причине использовать эту версию. Жесткая реализация выше работает для меня.

private class ToastAsyncTask extends AsyncTask<Void, String, Void> { 

     private WeakReference<Context> contextRef; 

     public ToastAsyncTask(Context context) { 
      contextRef = new WeakReference<Context>(context); 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      SystemClock.sleep(1000); 
      publishProgress("Toast msg string"); 
      SystemClock.sleep(1000); 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      if (contextRef.get() != null) { 
       Toast.makeText(contextRef.get(), values[0], Toast.LENGTH_SHORT).show(); 
      } else { 
       // The context was destroyed.. check what you are doing 
      } 
     } 
    } 

Используйте его как этот

new ToastAsyncTask(MainActivity.this).execute(); 
+0

getApplicationContext() undefined ... – mark

+0

проверить обновление выше –

Смежные вопросы