gpt4 book ai didi

安卓 fragment 。在屏幕旋转或配置更改期间保留 AsyncTask

转载 作者:IT老高 更新时间:2023-10-28 13:08:42 25 4
gpt4 key购买 nike

我正在开发一款智能手机/平板电脑应用,仅使用一个 APK,并根据屏幕大小按需加载资源,最佳设计选择似乎是通过 ACL 使用 Fragments。

这个应用程序一直运行良好,直到现在只是基于 Activity 。这是我如何处理 Activity 中的 AsyncTasks 和 ProgressDialogs 的模拟类,以便即使在屏幕旋转或在通信过程中发生配置更改时它们也能正常工作。

我不会更改 list 以避免重新创建 Activity,我不想这样做的原因有很多,但主要是因为官方文档说它不推荐并且我到目前为止没有它,所以请不要推荐那条路线。

public class Login extends Activity {

static ProgressDialog pd;
AsyncTask<String, Void, Boolean> asyncLoginThread;

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.login);
//SETUP UI OBJECTS
restoreAsyncTask();
}

@Override
public Object onRetainNonConfigurationInstance() {
if (pd != null) pd.dismiss();
if (asyncLoginThread != null) return (asyncLoginThread);
return super.onRetainNonConfigurationInstance();
}

private void restoreAsyncTask();() {
pd = new ProgressDialog(Login.this);
if (getLastNonConfigurationInstance() != null) {
asyncLoginThread = (AsyncTask<String, Void, Boolean>) getLastNonConfigurationInstance();
if (asyncLoginThread != null) {
if (!(asyncLoginThread.getStatus()
.equals(AsyncTask.Status.FINISHED))) {
showProgressDialog();
}
}
}
}

public class LoginThread extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... args) {
try {
//Connect to WS, recieve a JSON/XML Response
//Place it somewhere I can use it.
} catch (Exception e) {
return true;
}
return true;
}

protected void onPostExecute(Boolean result) {
if (result) {
pd.dismiss();
//Handle the response. Either deny entry or launch new Login Succesful Activity
}
}
}
}

这段代码运行良好,我有大约 10.000 个用户没有提示,所以将这个逻辑复制到新的基于 fragment 的设计中似乎是合乎逻辑的,但是,当然,它不起作用。

这里是登录 fragment :

public class LoginFragment extends Fragment {

FragmentActivity parentActivity;
static ProgressDialog pd;
AsyncTask<String, Void, Boolean> asyncLoginThread;

public interface OnLoginSuccessfulListener {
public void onLoginSuccessful(GlobalContainer globalContainer);
}

public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
//Save some stuff for the UI State
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setRetainInstance(true);
//If I setRetainInstance(true), savedInstanceState is always null. Besides that, when loading UI State, a NPE is thrown when looking for UI Objects.
parentActivity = getActivity();
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
loginSuccessfulListener = (OnLoginSuccessfulListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnLoginSuccessfulListener");
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
RelativeLayout loginLayout = (RelativeLayout) inflater.inflate(R.layout.login, container, false);
return loginLayout;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//SETUP UI OBJECTS
if(savedInstanceState != null){
//Reload UI state. Im doing this properly, keeping the content of the UI objects, not the object it self to avoid memory leaks.
}
}

public class LoginThread extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... args) {
try {
//Connect to WS, recieve a JSON/XML Response
//Place it somewhere I can use it.
} catch (Exception e) {
return true;
}
return true;
}

protected void onPostExecute(Boolean result) {
if (result) {
pd.dismiss();
//Handle the response. Either deny entry or launch new Login Succesful Activity
}
}
}
}
}

我不能使用 onRetainNonConfigurationInstance(),因为它必须从 Activity 而不是 Fragment 调用,getLastNonConfigurationInstance() 也是如此。我在这里读过一些类似的问题,但没有答案。

我知道可能需要一些工作才能将这些东西正确组织成 fragment ,也就是说,我想保持相同的基本设计逻辑。

在配置更改期间保留 AsyncTask 的正确方法是什么,如果它仍在运行,则显示一个 progressDialog,考虑到 AsyncTask 是 Fragment 的内部类并且它是 Fragment 本身谁调用了 AsyncTask.execute()?

最佳答案

fragment 实际上可以使这变得容易得多。只需使用方法Fragment.setRetainInstance(boolean)让您的 fragment 实例在配置更改中保留。请注意,这是 Activity.onRetainnonConfigurationInstance() 的推荐替换。在文档中。

如果出于某种原因您真的不想使用保留 fragment ,您可以采取其他方法。请注意,每个 fragment 都有一个由 Fragment.getId() 返回的唯一标识符。 .您还可以通过 Fragment.getActivity().isChangingConfigurations() 了解是否正在拆除 fragment 以进行配置更改。 .因此,在您决定停止 AsyncTask(最有可能在 onStop() 或 onDestroy() 中)时,您可以检查配置是否正在更改,如果是,请将其粘贴在 fragment 标识符下的静态 SparseArray 中,然后在 onCreate() 或 onStart() 中查看稀疏数组中是否有可用的 AsyncTask。

关于安卓 fragment 。在屏幕旋转或配置更改期间保留 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8417885/

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