Android - Written fragment without a head

I read about how to interact between the user interface and the background thread here .

This article notes the following:

AsyncTask does not automatically handle configuration changes, that is, if activity is recreated. The programmer must deal with this in his coding. A common solution to this is to declare AsyncTask in a left headless snippet.

I do not understand what the remaining headless fragment is.

For example, this way I can add a fragment:

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.frame, new MyFragment());
transaction.commit();

And in the snippet, I can execute AsyncTask as follows:

MyTask myTask = new MyTask();
String[] args = {"Hello"};
myTask.execute(args);

Is this called declaring AsyncTask in a saved headless snippet?

+4
2

- , , . onCreate() setRetainInstance()true;. , . , AsyncTask , AsyncTask.

onCreate . , getFragmentManager().findFragmentByTag(TAG), , . , onCreateView().

headlessFragment:

public class HeadlessProgressFragment extends Fragment {

private ProgressListener mProgressListener;
private AsyncTask<Void, Integer, Void> mProgressTask;

public interface ProgressListener {
    void updateProgress(int progress);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

public void setProgressListener(Context context) {
    mProgressListener = (ProgressListener) context;
}

public void startProgress(final int size) {
    if (mProgressTask == null || mProgressTask.getStatus() != AsyncTask.Status.RUNNING || mProgressTask.getStatus() == AsyncTask.Status.FINISHED) {
            mProgressTask = new AsyncTask<Void, Integer, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    for (int index = 0; index < size; index++) {
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } finally {
                            publishProgress(index + 1);
                        }
                    }
                    return null;
                }

                @Override
                protected void onProgressUpdate(Integer... values) {
                    super.onProgressUpdate(values);
                    if (mProgressListener != null) {
                        mProgressListener.updateProgress(values[0]);
                    }
                }
            };
            mProgressTask.execute();
        }
    }
}

- :

public class MainActivity extends FragmentActivity implements HeadlessProgressFragment.ProgressListener {

private static final String TAG = "progress_fragment";
private ProgressBar mProgressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dummy_view);
    mHeadlessProgressFragment = (HeadlessProgressFragment) getSupportFragmentManager().findFragmentByTag(TAG);
    if (mHeadlessProgressFragment == null) {
        mHeadlessProgressFragment = new HeadlessProgressFragment();
        getSupportFragmentManager().beginTransaction().add(mHeadlessProgressFragment,TAG).commit();
    }
    mHeadlessProgressFragment.setProgressListener(this);
    mRectFillingView = (ProgressRectFillingView) findViewById(R.id.progress_bar);
    final Button startFillBtn = (Button) findViewById(R.id.btn_start_filling);
    startFillBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mHeadlessProgressFragment.startProgress(100);
        }
    });
}

    @Override
    public void updateProgress(int progress) {
        mProgressBar.setProgress(progress);
    }
}
+4

, ( ), . , weakreference .

0

Source: https://habr.com/ru/post/1648995/


All Articles