package com.example.fragment; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import java.util.LinkedList; import java.util.List; public class TaskFragment extends Fragment { private final Object mLock = new Object(); private Boolean mReady = false; private List<Runnable> mPendingCallbacks = new LinkedList<>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); synchronized(mLock) { mReady = true; int pendingCallbacks = mPendingCallbacks.size(); while(pendingCallbacks-- > 0) { Runnable runnable = mPendingCallbacks.remove(0); runNow(runnable); } } } @Override public void onDetach() { super.onDetach(); synchronized(mLock) { mReady = false; } } protected void runTaskCallback(Runnable runnable) { if(mReady) runNow(runnable); else addPending(runnable); } protected void executeTask(AsyncTask<Void, ?, ?> task) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // use AsyncTask.THREAD_POOL_EXECUTOR or AsyncTask.SERIAL_EXECUTOR task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { task.execute(); } } private void runNow(Runnable runnable) { //Logcat.d("" + runnable.getClass().getEnclosingMethod()); getActivity().runOnUiThread(runnable); } private void addPending(Runnable runnable) { synchronized(mLock) { //Logcat.d("" + runnable.getClass().getEnclosingMethod()); mPendingCallbacks.add(runnable); } } }