-1

In my application, I want to run code every 120second and to achieve this I am using Thread.
Following is the code snippet that I am using, but it is giving me Force close error.

Show me error for this line :

getActivity().runOnUiThread(new Runnable() {}

My Codes :

public class MainReminderFragment extends Fragment {

    @BindView(R.id.mainExplore_noExploreTxt)
    TextView mainExplore_noExploreTxt;
    @BindView(R.id.newsPageLoadLay)
    RelativeLayout newsPageLoadLay;
    @BindView(R.id.toolbarTitleTxt)
    TextView toolbarTitleTxt;
    private Context context;
    public List<Datum> model = new ArrayList<>();
    public ReminderAdapter reminderAdapter;
    private SharedPrefrencesHandler prefrencesHandler;
    private String token = "";
    private LinearLayoutManager layoutManager;
    private MainActivity mainActivity;
    private InterfaceApi api;
    private boolean isRunning = false;
    public ProgressBar mainExplore_progressBar;
    public RecyclerView mainExplore_recyclerView;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_main_reminder, container, false);
        //Initialize
        ButterKnife.bind(this, view);
        context = getActivity();
        prefrencesHandler = new SharedPrefrencesHandler(context);
        reminderAdapter = new ReminderAdapter(context, model);
        layoutManager = new LinearLayoutManager(context);
        mainExplore_progressBar = view.findViewById(R.id.mainExplore_progressBar);
        mainExplore_recyclerView = view.findViewById(R.id.mainExplore_recyclerView);
        isRunning = true;
        mainActivity = (MainActivity) getActivity();
        api = ApiClient.getClient().create(InterfaceApi.class);
        //Toolbar name
        toolbarTitleTxt.setText(context.getResources().getString(R.string.reminder));
        //RecyclerView
        mainExplore_recyclerView.setLayoutManager(layoutManager);
        mainExplore_recyclerView.setHasFixedSize(true);
        //Get token
        token = prefrencesHandler.getFromShared(SharedPrefrencesKeys.TOKEN.name());
        //Get data
        getData();
        if (getActivity() != null) {
            Thread thread = new Thread() {
                @Override
                public void run() {
                    float i;
                    try {
                        for (i = 0; i <= 100; i++) {
                            getActivity().runOnUiThread(new Runnable() {
                                public void run() {
                                    getData();
                                }
                            });
                            sleep(120000);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            thread.start();
        }
        return view;
    }

    //Get data
    private void getData() {
        try {
            Call<SerialReminderListResponse> call = api.getListSerialReminder(token, "2", sendData(1));

            mainExplore_progressBar.setVisibility(View.VISIBLE);

            call.enqueue(new Callback<SerialReminderListResponse>() {
                @Override
                public void onResponse(Call<SerialReminderListResponse> call, Response<SerialReminderListResponse> response) {
                    if (response.body().getData() != null) {
                        if (response.body().getData().size() > 0) {
                            model.clear();
                            model.addAll(response.body().getData());
                            reminderAdapter.notifyDataSetChanged();
                            mainExplore_recyclerView.setAdapter(reminderAdapter);
                            //Gone no explore
                            mainExplore_noExploreTxt.setVisibility(View.GONE);
                        } else {
                            mainExplore_noExploreTxt.setVisibility(View.VISIBLE);
                            mainExplore_recyclerView.setVisibility(View.GONE);
                        }
                    }

                    mainExplore_progressBar.setVisibility(View.GONE);
                }

                @Override
                public void onFailure(Call<SerialReminderListResponse> call, Throwable t) {
                    mainExplore_progressBar.setVisibility(View.GONE);
                }
            });
        } catch (Exception e) {
        }
    }

Force close error in logCat :

Process: in.nouri.sevenwatchlist, PID: 7104
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference
at com.app.test.Fragments.MainPageFrags.MainReminderFragment$1.run(MainReminderFragment.java:136)
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
BoboGoooool
  • 79
  • 1
  • 1
  • 6

3 Answers3

1

Your below code

getActivity().runOnUiThread(new Runnable() {
                                    public void run() {
                                        getData();
                                    }
                                });
                                sleep(120000);

Replce With:

new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                         getData();
                    }
                }, 120000);
Tushar Lathiya
  • 940
  • 9
  • 26
0

Try this one.

TextView tv= new TextView(this);
tv.postDelayed(sendData, 1000);

Handler handler = new Handler();

private Runnable sendData=new Runnable(){
public void run(){
    try {
        //prepare and send the data here..
        handler.removeCallbacks(sendData);
        handler.postDelayed(sendData, 12000);    
    }
    catch (Exception e) {
        e.printStackTrace();
    }   
 }
};
Hardik Vasani
  • 876
  • 1
  • 8
  • 14
0

I recommend using ScheduledExecutorService as it is based on nano time, hence more accurate. Example:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool( 1 );

final Runnable r = new Runnable() {
        public void run() {
                // execution point 
        }
};

scheduler.scheduleAtFixedRate(r, 0, 1000, MILLISECONDS);
RonTLV
  • 2,376
  • 2
  • 24
  • 38