5

Mam problem z zastąpieniem fragmentu za pomocą FragmentManager. Mój problem polega na blokowaniu interfejsu użytkownika. Próbuję znaleźć dobre praktyki i/lub bibliotekę, aby poradzić sobie z moimi problemami.Freezing UI podczas transakcji fragmentów

Część mojego kodu:

Główny układ działalność:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/my_drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<FrameLayout 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

</android.support.v4.widget.DrawerLayout> 

Główna klasa aktywność

public class MyActivity extends Activity 

metodą

public void nextFragment(Fragment fragment, int position) { 
    fragment.setArguments(new Bundle()); 
    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager 
      .beginTransaction() 
      .replace(R.id.content, fragment).commit(); 

} 

Każdy mojego fragmentu jest jak

import android.app.Fragment; 

public class SomeFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    RelativeLayout rootView = (RelativeLayout) inflater.inflate(
      R.layout.fragment_layout, container, false); 
    //many long time data downloading & creating view 
    } 

private void nextFragment() { 

     ((MyActivity) getActivity()).nextFragment(
       new SomeNextFragment(), 0); 

    } 
} 

Teraz z powodu pobierania danych z każdego startu fragmentu mój interfejs użytkownika jest zamrożony. Z góry dziękuję za pomoc.

+0

Używasz układ support.v4 z android.app.Fragments i nie jestem pewien dlaczego. Zmień 'extends Activity' na' extend FragmentActivity', zmień 'getFragmentManager()' na 'getSupportFragmentManager()'. Zmień import 'android.app.Fragment' na' android.support.v4.Fragment'. – EpicPandaForce

+0

Używam nawigacjiDrawer i przez przykład strony dla programistów Androida Używam tego przykładu. – Meryl

+2

Ale nie żartuję, powinieneś zmienić fragment, aby obsługiwał fragment – EpicPandaForce

Odpowiedz

2

Z reguły nie powinieneś wykonywać długich operacji/blokowania w wątku interfejsu użytkownika. Użyj wątku roboczego lub AsyncTask.

Ogólnie proponuję utworzyć wszystko, co możliwe w onCreateView, a następnie ustawić wartości po zakończeniu operacji w tle. Na przykład utwórz natychmiast TextView, a następnie, gdy otrzymasz wynik z operacji w tle, ustaw tekst w już istniejącym TextView.

Aby użyć wątek:

final Handler handler = new Handler(); 
new Thread(new Runnable(){ 
    @Override 
    public void run(){ 
     //long running code 
     //this is running on a background thread 
     final String someText = //result of long running code 
     handler.post(new Runnable(){ 
      @Override 
      public void run(){ 
       //since the handler was created on the UI thread, 
       // this code will run on the UI thread 
       someTextView.setText(someText); 
      } 
     }); 
    } 
}).start(); 

Można również użyć getActivity().runOnUiThread(new Runnable(){...}); zamiast korzystania Handler

Powiązane problemy