2013-06-25 3 views
1

В следующем методе onloadfinished я пытаюсь открыть фрагмент диалога, когда результат равен null. Однако это дает мне ошибку, в то время как открытие диалогового окна предупреждений отлично работает с ним.java.lang.IllegalStateException при открытии фрагмента диалога в onloadfinished

java.lang.IllegalStateException: Can't perform this action inside of onLoadFinished 

Что эта ошибка говорится здесь:

@Override 
public void onLoadFinished(Loader<Map<String, Integer>> arg0, 
     Map<String, Integer> result) { 
    if (result == null) { 
     /*netEMessage(); 
     * At this place i was calling alert dialog before but Now calling Dialog in onload finished gives me error*/ 
     return; 
    } 
} 



private void netEMessage() { 

    NetowrkErrorDialog mErrorDialog = NetowrkErrorDialog.newInstance(); 
    mErrorDialog.setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_DeviceDefault_NoActionBar_Fullscreen); 
    mErrorDialog.setCancelable(false); 
    mErrorDialog.show(mOrderActivity.getSupportFragmentManager(), "networkerror"); 
} 

Полная ошибка LogCat

0java.lang.IllegalStateException: Can not perform this action inside of onLoadFinished 
1at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1331) 
2at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338) 
3at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595) 
4at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574) 
5at android.support.v4.app.DialogFragment.show(DialogFragment.java:127) 
6at com.fss.pos.presentation.MenuFragment.netEMessage(MenuFragment.java:178) 
7at com.fss.pos.presentation.MenuFragment.onLoadFinished(MenuFragment.java:144) 
8at com.fss.pos.presentation.MenuFragment.onLoadFinished(MenuFragment.java:1) 
9at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:427) 
10at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:395) 
11at android.support.v4.content.Loader.deliverResult(Loader.java:103) 
12at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:221) 
13at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61) 
14at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461) 
15at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47) 
16at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474) 
17at android.os.Handler.dispatchMessage(Handler.java:99) 
18at android.os.Looper.loop(Looper.java:137) 
19at android.app.ActivityThread.main(ActivityThread.java:5041) 
20at java.lang.reflect.Method.invokeNative(Native Method) 
21at java.lang.reflect.Method.invoke(Method.java:511) 
22at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
23at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
24at dalvik.system.NativeStart.main(Native Method) 
+0

У вас есть синтаксическая ошибка. Отсутствует '}' для вашего 'onLoadFinished()'. – BLaZuRE

+0

Показать полный журнал ошибок и версию кода, которая создает ошибку –

+0

@Michael Butscher Как сохранить полную ошибку журнала в eclipse – Bora

ответ

0

Проблема в том, что вы не можете изменить, шоу или сделать что-то, что связано с вашим просмотра или визуальных компонентов. Если вы хотите сделать что-то подобное, вам нужно пользователю следующий код:.

An_Activity.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     //Here call your method 
     netEMessage(); 
    } 
}); 

An_Activity является любая деятельность (в данном случае деятельность, где вы называете нить или что-то подобное

в вашем конкретном случай поместить код внутри, если:.

if (result == null) { 
    /*netEMessage(); 
    * At this place i was calling alert dialog before but Now calling Dialog in onload finished  gives me error*/ 

    (Put the Code here) 

    return; 
} 
+1

Но код в «onLoadFinished» всегда работает в потоке пользовательского интерфейса, в текущей активности ... –

6

Вот некоторые фоны, чтобы помочь любому, кто встречает это исключение

исключение брошено потому что фреймворк не позволяет совершать транзакцию фрагмента в том же стеке вызовов, что и onLoadFinished(). Такое поведение обеспечивает защиту от потери состояния, поскольку загрузчики обычно основаны на фоновом потоке (AsyncTaskLoader), который может завершить свою работу и в любое время уведомить об этом.

Возможны две потенциальные проблемы: 1. Рамка уже сохранила состояние (например, из-за изменения ориентации) фрагментов в менеджере фрагментов при выполнении вызова onLoadFinished(). Выполнение транзакции в этом контексте приведет к потере состояния, поскольку эта поздняя транзакция не включена в сохраненное состояние. 2. Рамка не завершила восстановление из предыдущего сохраненного состояния. Здесь транзакция происходит слишком рано, прежде чем состояние будет восстановлено.

Есть две проблемы с ответом Марии выше: 1. вызова runOnUiThread() не помогает, потому что onLoadFinished() вызывается в потоке пользовательского интерфейса, что означает вызов runOnUiThread() будет вызываться в том же стеке вызовов что вызовет исключение. В документации говорится: «Если текущий поток - это поток пользовательского интерфейса, то действие выполняется немедленно». 2. Даже если вызов (здесь DialogFragment.show()) не было сделано в том же стеке вызовов), например, путем:

public void onLoadFinished(Loader<Map<String, Integer>> arg0, 
          Map<String, Integer> result) { 
    if (result == null) { 

     new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       netEMessage(); 
      } 
     }); 
    } 
} 

риски выше, будут по-прежнему существует.

Лучшим решением этой проблемы является перемещение транзакции фрагмента в другое место в потоке, при этом проблемы 1 и 2. выше не могут произойти. Например, выполнение транзакции из Activity.onPostResume().

Удачи вам!