SORU
24 Temmuz 2012, Salı


Android. Parça getActivity() bir ara null döndürür

Hata raporları konsol geliştirici bir ara NPE konuda raporlar görüyorum. Ben sorunun ne olduğunu anlamak değil benim kod ile. Emülatör ve cihazımı forcecloses, ancak bazı kullanıcılar iyi olmadan uygulama çalışmaları bölümü sınıfta NullPointerException zaman çağırır getActivity() yöntemi.

Faaliyet

pulic class MyActivity extends FragmentActivity{

private ViewPager pager; 
private TitlePageIndicator indicator;
private TabsAdapter adapter;

 @Override
public void onCreate(Bundle savedInstanceState) {

    pager = (ViewPager) findViewById(R.id.pager);;
    indicator = (TitlePageIndicator) findViewById(R.id.indicator);
    adapter = new TabsAdapter(getSupportFragmentManager(), false);

    adapter.addFragment(new FirstFragment());
    adapter.addFragment(new SecondFragment());
    indicator.notifyDataSetChanged();
    adapter.notifyDataSetChanged();

    // push first task
    FirstTask firstTask = new FirstTask(MyActivity.this);
    // set first fragment as listener
    firstTask.setTaskListener((TaskListener) adapter.getItem(0));
    firstTask.execute();

}

 indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            Fragment currentFragment = adapter.getItem(position);
            ((Taskable) currentFragment).executeTask();
        }

        @Override
        public void onPageScrolled(int i, float v, int i1) {}

        @Override
        public void onPageScrollStateChanged(int i) {}
 });

}

AsyncTask sınıfı

public class FirstTask extends AsyncTask{

private TaskListener taskListener;

...

@Override
protected void onPostExecute(T result) {
   ...  
   taskListener.onTaskComplete(result);
}

}

Fragment sınıfı

public class FirstFragment extends Fragment immplements Taskable, TaskListener{


public FirstFragment() {
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.first_view, container, false);;
}

@Override
public void executeTask() {
    FirstTask firstTask = new FirstTask(MyActivity.this);
    firstTask.setTaskListener(this);
    firstTask.execute();
}


@Override
public void onTaskComplete(T result) {
    // NPE is here 
    Resources res = getActivity().getResources();
    ...
}

}

Belki de bu hata uygulamaları arka plandan tekrar ne zaman olur. Bu durumun üstesinden nasıl ben bu durumda doğru mu?

CEVAP
17 EKİM 2012, ÇARŞAMBA


Benim soruna bir çözüm bulmuş gibi görünüyor. Çok iyi açıklamalar here hereverilmiştir. İşte benim örnek:

pulic class MyActivity extends FragmentActivity{

private ViewPager pager; 
private TitlePageIndicator indicator;
private TabsAdapter adapter;
private Bundle savedInstanceState;

 @Override
public void onCreate(Bundle savedInstanceState) {

    .... 
    this.savedInstanceState = savedInstanceState;
    pager = (ViewPager) findViewById(R.id.pager);;
    indicator = (TitlePageIndicator) findViewById(R.id.indicator);
    adapter = new TabsAdapter(getSupportFragmentManager(), false);

    if (savedInstanceState == null){    
        adapter.addFragment(new FirstFragment());
        adapter.addFragment(new SecondFragment());
    }else{
        Integer  count  = savedInstanceState.getInt("tabsCount");
        String[] titles = savedInstanceState.getStringArray("titles");
        for (int i = 0; i < count; i  ){
            adapter.addFragment(getFragment(i), titles[i]);
        }
    }


    indicator.notifyDataSetChanged();
    adapter.notifyDataSetChanged();

    // push first task
    FirstTask firstTask = new FirstTask(MyActivity.this);
    // set first fragment as listener
    firstTask.setTaskListener((TaskListener) getFragment(0));
    firstTask.execute();

}

private Fragment getFragment(int position){
     return savedInstanceState == null ? adapter.getItem(position) : getSupportFragmentManager().findFragmentByTag(getFragmentTag(position));
}

private String getFragmentTag(int position) {
    return "android:switcher:"   R.id.pager   ":"   position;
}

 @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("tabsCount",      adapter.getCount());
    outState.putStringArray("titles", adapter.getTitles().toArray(new String[0]));
}

 indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            Fragment currentFragment = adapter.getItem(position);
            ((Taskable) currentFragment).executeTask();
        }

        @Override
        public void onPageScrolled(int i, float v, int i1) {}

        @Override
        public void onPageScrollStateChanged(int i) {}
 });

Bu kod, ana fikir, normalde uygulamanız çalışırken, yeni parçaları oluşturmak ve adaptör için onları geçmek. Uygulamanız çıkıldığında bölümü yöneticisi zaten bu parçanın örneği vardır ve parça yöneticisi ve adaptörü geçmesi gerekir.

GÜNCELLEME

Ayrıca, kontrol parçaları kullanarak getActivity önce isAdded zaman iyi bir uygulamadır() denir. Bu bölümü faaliyetten ayrılan, bir null işaretçi istisna önlemek yardımcı olur. Örneğin, bir faaliyet zaman uyumsuz bir görev iten bir parçası içerebilir. Görev tamamlandığında, onTaskComplete dinleyici denir.

@Override
public void onTaskComplete(List<Feed> result) {

    progress.setVisibility(View.GONE);
    progress.setIndeterminate(false);
    list.setVisibility(View.VISIBLE);

    if (isAdded()) {

        adapter = new FeedAdapter(getActivity(), R.layout.feed_item, result);
        list.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

}

Açarsak parça, itin bir görev, ve sonra hızlı bir şekilde basın geri dönmek için bir önceki etkinlik, ne zaman görev tamamlanmış olacak denemek için erişim faaliyeti onPostExecute() çağırarak getActivity() yöntemi. Etkinlik çoktan ayrılmış ve bu onay yoksa:

if (isAdded()) 

uygulama çöker.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ampisound

    Ampisound

    12 Kasım 2006
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • RiceBunny

    RiceBunny

    16 ŞUBAT 2006