gpt4 book ai didi

点击按钮时的 Android Loader vs AsyncTask

转载 作者:行者123 更新时间:2023-11-29 18:00:00 28 4
gpt4 key购买 nike

我有一个 Activity 不需要来自服务器的数据加载 - 只是简单的 ui 初始化

UI 有几个按钮。

用户点击其中之一,应用向服务器发送请求(rest call)当请求正在处理时显示微调器(大约 10 秒)

现在它使用 AsyncTask - 所以如果应用程序将纵向更改为横向 - Activity 将重新启动并且我会松开进程

第二个选项是使用 Loader - 问题是它是在点击按钮时启动的 - 而不是在 Activity 启动时启动

这会导致许多异常 - 当 LoaderManager 向未启动项发送事件时

有什么解决办法吗?

一些评论:- 10秒只是举例- 将用户锁定到一个方向不是一种选择- 服务对于简单的休息电话来说太过分了

最佳答案

public class TestActivity extends FragmentActivity {

private Button one;
private Button two;

private final int ONE_ID = 0;
private final int TWO_ID = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
one = (Button) findViewById(R.id.one);
two = (Button) findViewById(R.id.two);

one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getLoaderManager().restartLoader(ONE_ID, null, callbacks);
}
});

two.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getLoaderManager().restartLoader(ONE_ID, null, callbacks);
}
});

Loader<AsyncTaskLoaderResult<Result>> loader = getLoaderManager().getLoader(ONE_ID);
if (loader != null) {
getLoaderManager().initLoader(ONE_ID, null, callbacks);
}
loader = getLoaderManager().getLoader(TWO_ID);
if (loader != null) {
getLoaderManager().initLoader(TWO_ID, null, callbacks);
}


}

public static class AsyncTaskLoaderResult<E> {
public E data;
public Bundle args;
}

public static class Result {

}

private LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<Result>> callbacks = new LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<Result>>() {
@Override
public Loader<AsyncTaskLoaderResult<Result>> onCreateLoader(int id, Bundle args) {
/**
* according different Id, create different AsyncTaskLoader
*/
switch (id) {
case ONE_ID:
return new OneAsyncTaskLoader(TestActivity.this);
case TWO_ID:
return new TwoAsyncTaskLoader(TestActivity.this);
}
return null;
}

@Override
public void onLoadFinished(Loader<AsyncTaskLoaderResult<Result>> loader, AsyncTaskLoaderResult<Result> data) {
/**
* handle result
*/
switch (loader.getId()) {

}

getLoaderManager().destroyLoader(loader.getId());
}

@Override
public void onLoaderReset(Loader<AsyncTaskLoaderResult<Result>> loader) {

}
};

public static class OneAsyncTaskLoader extends AsyncTaskLoader<AsyncTaskLoaderResult<Result>> {

private AsyncTaskLoaderResult<Result> result;

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

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

@Override
public AsyncTaskLoaderResult<Result> loadInBackground() {
/**
* send request to server
*/
result = new AsyncTaskLoaderResult<Result>();
result.data = null; // result.data comes from server's response
return result;
}
}

public static class TwoAsyncTaskLoader extends AsyncTaskLoader<AsyncTaskLoaderResult<Result>> {


private AsyncTaskLoaderResult<Result> result;

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

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

@Override
public AsyncTaskLoaderResult<Result> loadInBackground() {
/**
* send request to server
*/
result = new AsyncTaskLoaderResult<Result>();
result.data = null; // result.data comes from server's response
return result;
}
}
}

关于点击按钮时的 Android Loader vs AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16803865/

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