FATAL EXCEPTION: Timer-0

1

I am showing in a fragment, a sequence of three images through a ViewPager, I have added to the fragment a timer TimerTask for the images, occasionally an error is generated that closes the application and refers to the line:

getActivity().runOnUiThread(new Runnable() {

I had done this exercise before but in an Activity and this line was like this:

MainActivity.this.runOnUiThread(new Runnable() {

Next I show the fragment code and two Logcat screens, I support your help.

Fragment_Home

public class Fragment_Home extends Fragment {

//ViewPager
ViewPager viewPager;
CustomSwipeAadapter adapter;

public Fragment_Home() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_home, container, false);

    //ViewPager
    viewPager = (ViewPager)v.findViewById(R.id.view_pager);
    adapter = new CustomSwipeAadapter(getContext());
    viewPager.setAdapter(adapter);

    Timer timer = new Timer();
    timer.schedule(new MyTimerTask(), 3000, 4000);

    return v;
}

public class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {

                if(viewPager.getCurrentItem()==0){
                    viewPager.setCurrentItem(1);
                }else if(viewPager.getCurrentItem()==1){
                    viewPager.setCurrentItem(2);
                }else if(viewPager.getCurrentItem()==2){
                    viewPager.setCurrentItem(0);
                }
            }
        });
    }
}
private FragmentManager getSupportFragmentManager() {
    return getFragmentManager();
}
}

Images:

    
asked by Ivan Alfredo 14.11.2017 в 20:35
source

1 answer

1

The error is that you can not find the Activity to call runOnUiThread() , this can happen for example when you rotate your device, the Activity containing the Fragment is destroyed but you have scheduled the execution of a task, if the Activity is momentarily destroyed it can happen that the instance of Activity has null value and you can not call:

getActivity().runOnUiThread()

In this case I recommend validating if getActivity() exists:

public class MyTimerTask extends TimerTask {

    @Override
    public void run() {

       if(getActivity() != null) {  

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

       }

    }
}

Another option is to define within your AndroidManifest.xml the following property at the Activity that loads the Fragment :

android:configChanges="keyboardHidden|orientation|screenSize"

How to prevent reload of the Activity or Fragment when rotating etc. on Android?

    
answered by 14.11.2017 / 21:19
source