Intereting Posts
Как я могу получить версию ядра Android через adb (или через команду Python)? Как добавить контакт с именем и фамилией с помощью намерения Не удалось решить: junit: junit: 4.12 в android studio 1.4 на ubuntu IndexOutOfBoundsException после повторного заполнения массива ArrayList (только для Marshmallow) Обновление Android-фильтра Sqlite singleton db не удалось Как настроить представление Android на основе размеров родителя Как EasyEditSpan используется в Android для частичного редактирования текста? Измените цвет выделения выбранного элемента для меню меню жесткого меню Как получить погоду в текущем местоположении AlarmManager, когда телефон выключен – ANDROID Овальная форма обрезается при создании программно OnViewCreated – неправильное место для замены фрагмента? Функция «Добавить нереализованные методы» в Android Studio Как программно заполнить раздел напоминаний в приложении «Календарь» Android-устройства? Карты Google не загружаются после обфускации ProGuard в Eclipse

Добавление диалога прогресса Android в фоновом режиме с помощью AsyncTask, получение исключения FATAL

  1. Iam, вызывающий Asynctask из запланированной службы Каждые 10 минут он будет запущен .

  2. При запуске диалога «Сервис», « Выполнение», получая «Исключение из OnpreExecute» .

ОШИБКА :

FATAL EXCEPTION: main android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application at android.view.ViewRootImpl.setView(ViewRootImpl.java:594) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) at android.app.Dialog.show(Dialog.java:286) 

EDIT 1: диспетчер аварийных сигналов для вызова службы каждые 5 минут

 /*Alarm manager Service for From Server*/ private void setServerFetch() { // for to Server to GPS PING Intent myIntent1 = new Intent(LoginPage.this, AlarmService.class); pendingintent1 = PendingIntent.getService(LoginPage.this, 1111, myIntent1, 0); AlarmManager alarmManager5 = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar calendar1 = Calendar.getInstance(); calendar1.setTimeInMillis(System.currentTimeMillis()); calendar1.add(Calendar.SECOND, 1); alarmManager5.set(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), pendingintent1); alarmManager5.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), 300 * 1000, pendingintent1); } 

Вызов AsyncTask из Service Onstart

  @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); try { Asynctask_Incident task=new Asynctask_Incident(); task=new(); } catch (Exception e) { e.printStackTrace(); Log.i("PING", "EXCEPTION in reading Data from Web Async task ONstart.!"); } } 

Метод Asynctask Class onStart

 public class Asynctask_Incident extends AsyncTask<String, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); runOnUiThread(new Runnable() { @Override public void run() { if (!pDialog.isShowing()) { pDialog = new ProgressDialog(appContext); pDialog.setCanceledOnTouchOutside(false); pDialog.setCancelable(false); pDialog.setMessage("Please Wait Updating Data From..."); pDialog.show(); } } }); } @Override protected Void doInBackground(String... params) { try { getAPICall(); } catch (Exception e) { e.printStackTrace(); if (pDialog.isShowing()) { pDialog.dismiss(); } } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); if (pDialog.isShowing()) { pDialog.dismiss(); } } } 

Помогите мне решить этот вопрос.

Solutions Collecting From Web of "Добавление диалога прогресса Android в фоновом режиме с помощью AsyncTask, получение исключения FATAL"

На самом деле вы не можете запустить диалог прогресса из службы, потому что ему нужен контекст действия, а не контекст приложения, который в вашем случае является нулевым.

Подробнее здесь: link1 , link2 и link3

Если вы хотите запустить диалог прогресса, основанный на действии службы, вы можете использовать шаблон проекта Observer, посмотрите здесь .

Обновление. Если ваше приложение запущено, вы можете использовать Handler и запускать его каждые 5 минут.

Вот полный пример:

 public class TestActivity extends AppCompatActivity { private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // new Asynctask_Incident(TestActivity.this).execute("url"); handler.postDelayed(this, 5 * DateUtils.MINUTE_IN_MILLIS); } }, 0); } public class Asynctask_Incident extends AsyncTask<String, Void, Void> { ProgressDialog pDialog; Context appContext; public Asynctask_Incident(Context ctx) { appContext = ctx; } @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(appContext); pDialog.setCanceledOnTouchOutside(false); pDialog.setCancelable(false); pDialog.setMessage("Please Wait Updating Data From..."); pDialog.show(); } @Override protected Void doInBackground(String... params) { try { getAPICall(); } catch (Exception e) { e.printStackTrace(); if (pDialog.isShowing()) { pDialog.dismiss(); } } return null; } private void getAPICall() { //5 seconds delay for test, you can put your code here try { Thread.sleep(5 * DateUtils.SECOND_IN_MILLIS); } catch (InterruptedException e) { e.printStackTrace(); } } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); if (pDialog.isShowing()) { pDialog.dismiss(); } } } } 

Интериализируйте свой ProgressDialog .

OnPreExecute ();

 runOnUiThread(new Runnable() { @Override public void run() { if (pDialog == null) { pDialog = new ProgressDialog(appContext); pDialog.setCanceledOnTouchOutside(false); pDialog.setCancelable(false); pDialog.setMessage("Please Wait Updating Data From..."); } pDialog.show(); } }); 

OnPostExecute ();

  pDialog.dismiss(); 

Исключение. Exception:android.vi‌​ew.WindowManager$BadT‌​okenException: Unable to add window -- token null is not for an application когда контекст не жив. Для этого исключения может быть и другая причина, но основной причиной является контекст. Более того, если ранее показано, что Dialog не отклоняется, может возникнуть исключение.

Попробуйте этот код:

 runOnUiThread(new Runnable() { @Override public void run() { if(appContext != null) { // if dialog is already showing, hide it if(pDialog != null && pDialog.isShowing()) { pDialog.dismiss(); } if (pDialog == null) { pDialog = new ProgressDialog(appContext); pDialog.setCanceledOnTouchOutside(false); pDialog.setCancelable(false); pDialog.setMessage("Please Wait Updating Data From..."); } pDialog.show(); } else { Log.e("Error","Context is Null"); } } }); 

Дополнительную проверку можно добавить: http://dimitar.me/android-displaying-dialogs-from-background-threads/

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

Также вы не должны называть ничего, что изменяет пользовательский интерфейс в методе doItBackground. Потому что этот метод работает в рабочем потоке. Любой вызов пользовательского интерфейса должен быть в основном потоке. OnPostExecute вызывается основным потоком. Поэтому размещайте связанные с ним вызовы, но не в doInBackground.

Эти строки в doInbackground необходимо удалить.

 if (pDialog.isShowing()) { pDialog.dismiss(); } 

1) Вам не нужна настройка ProgressDialog внутри Runnable , все в onPreExecute() и onPostExecute() уже выполняется в потоке пользовательского интерфейса. Только doInBackground() запускает поток пользовательского интерфейса.

2) Поместите класс AsyncTask в MainActivity , вызовите его из MainActivity , а не из вашей Service . Вызовите свою AsyncTask из MainActivity следующим образом:

 new MyAsyncTask(MainActivity.this).execute(""); 

3) Наконец, поместите этот конструктор в свой класс AsyncTask :

 public MyAsyncTask(Context context) { appContext = context; } 

Кажется, что ваш контекст не имеет нужного набора ресурсов. Убедитесь, что вы используете правильный контекст.

 Context context = this; ProgressDialog progressDialog = new ProgressDialog(context); progressDialog.show(); 

Где «this» – контекст AppCompatActivity или Activity