gpt4 book ai didi

java - Android - 保留 headless fragment

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:35:48 26 4
gpt4 key购买 nike

我正在阅读有关如何在 UI 和后台线程之间进行交互的信息 here .

本文有如下说明:

The AsyncTask does not handle configuration changes automatically, i.e. if the activity is recreated. The programmer has to handle that in his coding. A common solution to this is to declare the AsyncTask in a retained headless fragment.

我不明白保留的 headless fragment 是什么。

例如,通过这种方式我可以添加 fragment :

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

在 fragment 中我可以像这样执行 AsyncTask:

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

这叫做“在保留的 headless fragment 中声明 AsyncTask”吗?

最佳答案

headless fragment 只不过是没有 View 的 fragment 。在 fragment 生命周期的onCreate()中,使用setRetainInstance(true);。即使 Activity 重新创建,这也不会破坏 fragment 。因此,如果 AsyncTask 在 fragment 中运行,则在重新创建 Activity 时,您不会丢失 AsyncTask。

在 Activity 的 onCreate 中,您必须添加带有标签的 fragment 。在添加之前,使用 getFragmentManager().findFragmentByTag(TAG) 检查 fragment 是否存在,如果 fragment 为空则创建 fragment 的新实例并添加它。在 Fragment 中不会有任何 View 膨胀,因此无需重写 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();
}
}
}

在 Activity 中是这样的:

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);
mProgressBar = (ProgressBar) 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);
}
}

关于java - Android - 保留 headless fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38560611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com