2016-03-23 34 views
0

numaralı çocuk parçalarını ekleme Android uygulamamdaki başka bir parçacığa bir alt parçası eklemekle ilgili bir sorun yaşıyorum.Ayrı bir iş parçacığında

@Override 
    public View onCreateView(blah) { 
     Thread initializeStateThread = new Thead() { 
      public void run() { 
       // Make some requests to get some data that determines 
       // which child fragment to display 
       state = // Some state that corresponds to a child frag 

       // Method that set's the child fragment based on |state| 
       setChildFragment(state); 
      } 
     } 
     initializeStateThread.start() 

     // Do a bunch of other stuff 

     return view; 
    } 

    setChildFragment(State state) { 
     Fragment fragment = null; 
     switch (mState) { 
      case CASE_1: 
       fragment = new DriverFindSpotFragment(); 
       break; 
      case CASE_2: 
       fragment = new DriverNavigationFragment(); 
       break; 
      case CASE_3: 
       fragment = new DriverArriveSpotFragment(); 
       break; 
     } 

     getActivity().runOnUiThread(new Runnable() { 
     @Ovverride 
     public void run() { 
      getChildFragmentManager().beginTransaction(). 
       replace(R.id.driver_fragment_container, fragment).commit(); 
     }; 
    } 

Ancak, bu yalnızca zamanın yaklaşık% 50'sini çalışır: Üst fragmanı

Böyle bir şey var. Çocuk fragmanının diğer% 50'si sadece ortaya çıkmaz (bir hata ya da herhangi bir şey yoktur). Sorunun, ebeveynin görüşünün onCreateView biçiminde döndürülmesinden sonra bir çocuk parçası eklemeye çalıştığım gerçeğiyle ilgili olduğunu düşünüyorum.

Ana parçacığı ikinci bir ya da iki kez uyumaya zorlarsam, sorunun ortadan kalktığını fark ettim (bu durumda görünümün geri döndürülmesinden önce alt parçacığın ayarlanmasından dolayı farz ediyorum).

Hiç benzer bir sorunu olan var mı? Ya da benim bu teorimin neden bu konuyla ilgili olduğunu onaylayabilir mi? Sen yöntemini şöyle deneyebilirsiniz

+0

Neden parçacığı herhangi bir özel amaçla değiştiriyorsunuz? –

+0

İş parçacığı, sunucumdan bazı veriler isteme bitene kadar hangi çocuk parçasını ayarlamak istediğimi bilmiyorum; bu yüzden bunu (engelleme) istekleri – mkz4816

+0

yaptıktan sonra yapmak zorundayım Emin değilim ama iş parçacığı değiştirme ile ilgili bir sorun gibi görünüyor, –

cevap

0

fragmanında tanımlamak ve Ana iplik daki Fragment işlemin eklenmesiyle konumu/devlet

public void displayView(int position) { 
    Fragment fragment = null; 
    switch (position) { 
    case 0: 
     fragment = new FormFragment(); 
     break; 
    case 1: 
     fragment = new HomeFragment(); 
     break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getChildFragmentManager(); 
     FragmentTransaction transaction = fragmentManager 
       .beginTransaction(); 
     if (position != 0) 
      // transaction.addToBackStack("back"); 
      transaction.replace(R.id.main_ll_container, fragment).commit(); 
    } else { 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 
+0

durum için sunucu yanıtı sonra değiştirebilirsiniz Şimdi mantığı ayrı bir yöntemle soyutladıysanız - Problemin nasıl çözüleceğinden emin değilim? – mkz4816

+0

Parçanın değiştirilmesinde runnable amaçlarını mı soruyorum? –

+0

Bloke etme istekleri tamamlanana kadar parça değiştirilemez. Bu nedenle, parça değiştirmeyi doğrudan ana dişte yapamam. – mkz4816

0

deneyin ile değiştirin. Bunun gibi

:

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      getChildFragmentManager().beginTransaction().replace(R.id.driver_fragment_container, fragment).commit(); 
     } 
    }); 
+0

Bunu gerçekten yapamıyorum, çünkü hangi parçacığın iş parçacığının talep ettiği verileri almak için bekledikten sonra ayarlanacağını bilmiyorum. Tüm bunları ana iş parçacığı içinde yapsaydım, ana iş parçacığı engellerdi, ki bu kesinlikle istenmeyen bir şekilde – mkz4816

+0

Oh'dur ve aslında bunu kullanıcı arabiriminde çalıştırıyorum - hala çalışmıyor. Sahte kodumu güncelleyeceğim – mkz4816

+0

Anladım. Bu kodun amacına uygun olacağını düşünüyorum. Sadece parçalı işlem hattınızı – Sayem

0

yorum ve diğer cevaplar okuduktan sonra ve nerede gerçek sorunun ne olduğunu emin değilim.

getActivity().runOnUiThread(new Runnable() { 
    @Ovverride 
     public void run() { 
    } 
}); 

Kullanımı: Yerine

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Ovverride 
     public void run() { 
    } 
}); 

Bu sadece bir tahmin, büyük ihtimalle işe yarayacak olan.

İlgili konular