gpt4 book ai didi

Android 加载器在单击时启动,然后方向发生变化 - 不再提供数据

转载 作者:行者123 更新时间:2023-11-29 17:53:12 26 4
gpt4 key购买 nike

正如标题所说,我在单击按钮时启动了一个 Loader,然后我正在改变方向。在重新创建的 Activity 中,启动时不会自动调用 onLoadFinished。我怀疑 LoaderManager 不知道这个新创建的 Activity 实例,因为我认为它与 Activity 生命周期没有太大关系。但我可能错了......

这是加载程序,提供一个字符串数组并模拟它延迟 3 秒的数据结果。实现是 AsyncTaskLoader 的简化版本 sample code .

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public class ContentAsyncLoader extends AsyncTaskLoader<String[]> {
private String[] data;

public ContentAsyncLoader(Context context) {
super(context);
}

@Override
protected void onStartLoading() {
if (data != null) {
deliverResult(data);
} else {
forceLoad();
}
}

@Override
public String[] loadInBackground() {
synchronized (this) {
try {
wait(3000);
} catch (InterruptedException e) {
}
}
final String[] result = { "Dell Inspiron", "HTC One X", "HTC Wildfire S", "HTC Sense", "HTC Sensation XE", "iPhone 4S", "Samsung Galaxy Note 800", "Samsung Galaxy S3", "MacBook Air",
"Mac Mini", "MacBook Pro" };
return result;
}

@Override
protected void onStopLoading() {
cancelLoad();
}

@Override
protected void onReset() {
super.onReset();
onStopLoading();
data = null;
}

@Override
public void deliverResult(String[] data) {
if (isReset()) {
return;
}
this.data = data;
if (isStarted()) {
super.deliverResult(data);
}
}
}

下面是在单击按钮时启动加载程序的 Activity - ListViewButton:

public class MainActivity extends FragmentActivity implements OnClickListener, LoaderCallbacks<String[]> {

private static final int LOADER_ID = 1;
private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.list_view);
findViewById(R.id.btnSomeAction).setOnClickListener(this);
}

@Override
public void onClick(View v) {
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
}

@Override
public Loader<String[]> onCreateLoader(int id, Bundle bundle) {
ContentAsyncLoader loader = new ContentAsyncLoader(this);
return loader;
}

@Override
public void onLoaderReset(Loader<String[]> loader) {
}

@Override
public void onLoadFinished(Loader<String[]> loader, String[] data) {
if (data != null) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, data);
lv.setAdapter(adapter);
}
}
}

如果有人想要一个明确的问题:如何正确使用在单击按钮时启动的 Loader,以便在重新创建 Activity 时自动重新提供数据?

我有一些肮脏的解决方法来解决这个问题,方法是在单击按钮时将标志设置为 true,在调用 onSaveInstanceState 时保存它,然后在 onCreate 中检查如果存在则调用 initLoader;但是在这种情况下我讨厌这样做,当我从一个 Activity 中启动不同的加载器时,我需要为每个这样的加载器保留一个标志,因为我倾向于懒惰......例如:

private boolean loaderCreated;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.list_view);
findViewById(R.id.btnSomeAction).setOnClickListener(this);
if (savedInstanceState != null) {
loaderCreated = savedInstanceState.getBoolean("TEMP", false);
if(loaderCreated) {
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
}
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("TEMP", loaderCreated);
}

@Override
public void onClick(View v) {
loaderCreated = true;
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
}

没有更好的方法吗?

最佳答案

getSupportLoaderManager().initLoader(LOADER_ID, null, this); 如果之前按下按钮,则每次都应调用 onCreate

因为现在在定向之后 savedInstanceState 不为 null 并且您没有向加载程序询问数据。

我看到你做到了......;) 这是唯一的方法。

问候

关于Android 加载器在单击时启动,然后方向发生变化 - 不再提供数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504200/

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