Android: ProgressDialog.show () отказывает с getApplicationContext

Spring и В спящем режиме, определенно делают жизнь легче. Начало работы с ними могло бы быть немного трудоемким вначале, но Вы, конечно, извлечете выгоду из него позже. Теперь XML заменяется аннотациями, Вы не должны вводить сотни строк XML также.

можно хотеть полагать AppFuse уменьшать кривую обучения: генерируйте приложение, учитесь и адаптируйтесь, оно, и от Вас идет.

108
задан Felix 13 October 2009 в 17:41
поделиться

6 ответов

Какая у вас версия API? с помощью? Если я прав в том, в чем проблема, то это было исправлено в Android 1.6 (API версии 4).

Похоже, что ссылка на объект, getApplicationContext () возвращает просто указывает на null. Я думаю, у вас возникла проблема, аналогичная той, что была у меня, в том, что часть кода в onCreate () запускается до того, как окно действительно построено. Это будет взлом, но попробуйте запустить новый поток за несколько сотен миллисекунд (мне показалось, что IIRC: 300-400 работает, но вам нужно повозиться), который открывает ваш ProgressDialog и запускает все, что вам нужно ( например, сетевой ввод-вывод). Примерно так:

@Override
public void onCreate(Bundle savedInstanceState) {
    // do all your other stuff here

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mProgressDialog = ProgressDialog.show(
               YouTube.this.getApplicationContext(), "",
               YouTube.this.getString(R.string.loading), true);

            // start time consuming background process here
        }
    }, 1000); // starting it in 1 second
}
42
ответ дан 24 November 2019 в 03:28
поделиться

Я не думаю, что это проблема синхронизации вокруг нулевого контекста приложения

Попробуйте расширить Application в вашем приложении (или просто используйте его, если вы уже сделали это)

public class MyApp extends Application

Сделайте экземпляр доступным как частный синглтон. Это никогда не будет null

private static MyApp appInstance;

Сделайте статический помощник в MyApp (который будет использовать синглтон)

    public static void showProgressDialog( CharSequence title, CharSequence message )
{
    prog = ProgressDialog.show(appInstance, title, message, true); // Never Do This!
}

БУМ!!!

Также посмотрите ответ инженера android здесь: WindowManager$BadTokenException

Одной из причин этой ошибки может быть попытка отобразить приложение окно/диалог через Context, который не является Activity.

Теперь, я согласен, это не имеет смысла, что метод принимает параметр Context, а не Activity...

23
ответ дан 24 November 2019 в 03:28
поделиться

Я использую Android версии 2.1 с API уровня 7. Я столкнулся с этой (или подобной) проблемой и решил ее, используя следующее:

Dialog dialog = new Dialog(this);

вместо этого:

Dialog dialog = new Dialog(getApplicationContext());

Надеюсь, это поможет :)

127
ответ дан 24 November 2019 в 03:28
поделиться

Я реализовал Alert Dialog для исключения, возникающего в текущем представлении активности.Всякий раз, когда у меня возникало вот такое

AlertDialog.Builder builder = new AlertDialog.Builder(context);

Исключение в окне.Я пишу код для оповещения из onCreate().Так просто я использовал context = this; после setContentView() в onCreate() методе. Взял переменную context как глобальную, например Context context;

Пример кода

static Context context;

 public void onCreate(Bundle savedInstanceState)  { 
        super.onCreate(savedInstanceState); 


        setContentView(R.layout.network); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        context = this;
.......

Пример метода Alert

private void alertException(String execMsg){
        Log.i(TAG,"in alertException()..."+context);
        Log.e(TAG,"Exception :"+execMsg);
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
.......

У меня все работает нормально.Вообще-то я искал эту ошибку на StackOverflow и нашел этот запрос.Прочитав все ответы в этом посте, я попробовал этот способ и он работает.Я подумал, что это простое решение для преодоления исключения.

Спасибо, Rajendar

0
ответ дан 24 November 2019 в 03:28
поделиться

Чтобы обойти это, я создал базовый класс для всех моих действий, в котором я храню глобальные данные. В первом действии я сохранил контекст в переменной в моем базовом классе следующим образом:

Базовый класс

public static Context myucontext; 

Первое действие, производное от базового класса

mycontext = this

Затем я использую mycontext вместо getApplicationContext при создании диалогов.

AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();
1
ответ дан 24 November 2019 в 03:28
поделиться

Я создаю представление карты с детализированными наложениями. Я создавал свое itemizedoverlay, как это из моего mapActivity:

OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);

Я обнаружил, что получу исключение "android.view.WindowManager$BadTokenException: Не удается добавить окно -- token null не для приложения", когда запускается метод onTap моего элементарного оверлея (когда местоположение нажимается на mapview).

Я обнаружил, что если я просто передаю 'this' вместо 'getApplicationContext()' своему конструктору, проблема исчезнет. Это, по-видимому, подтверждает вывод alienjazzcat. странный.

6
ответ дан 24 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: