2010-09-13 4 views
3

Я пытаюсь отобразить Toast внутри AsyncTask. Это первая часть кода помещается в деятельности, мы можем назвать MyActivity, и работает отлично:Проблемы с контекстом при попытке отображения Toast

Toast.makeText(this, "Toast!", Toast.LENGTH_SHORT).show(); 

Затем я создаю новый экземпляр MyObject и вызывает method(). Этот код также размещен в MyActivity.

MyObject obj = new MyObject(this); 
obj.method(); 

Это определение MyObject. ProgressDialog отлично работает, но нет тостов.

public class MyObject { 
    Context cxt; 

    public MyObject(Context cxt) { 
     this.cxt = cxt; 
    } 

    public void method() { 
     new MyAsyncTask().execute(); 
    } 

    private class MyAsyncTask extends AsyncTask<Object, Integer, Boolean> { 
     protected void onPreExecute() { 
     Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // works fine 
    } 

     protected Boolean doInBackground(Object... params) { 
      Looper.prepare(); 
      Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); // doesn't work 
     } 
    } 
} 

Я полагал, что делал то же самое в своем первом примере и ниже, но, видимо, я что-то упускаю. Я также пробовал getApplicationContext() и cxt.getApplicationContext() вместо cxt, но с тем же результатом.

+0

Вы не должны создавать новые экземпляры деятельности с 'new' – Falmarri

+0

К сожалению, я не делаю этого обычно. Я просто переписал свой обычный код в лучший пример и не думал об этом. Но спасибо за это! :) – nip3o

ответ

2

Wrap, что в runOnUIThread метод:

runOnUiThread(new Runnable() { 
    public void run() { 
     Toast.makeText(cxt, "Toast!", Toast.LENGTH_SHORT).show(); 
    } 
}); 

Это потому, что метод doInBackground не выполняется на UI тему, так что вы должны заставить это.

0

Вы должны использовать

MyObject.this 

внутри AsyncTask

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

  • Нет связанных вопросов^_^