Android 如何将此asyncTask转换为AsyncTaskLoader?
由于movieListFetcher.listType是枚举,如何将此AsyncTask代码转换为AsyncTaskLoaderAndroid 如何将此asyncTask转换为AsyncTaskLoader?,android,android-asynctask,asynctaskloader,Android,Android Asynctask,Asynctaskloader,由于movieListFetcher.listType是枚举,如何将此AsyncTask代码转换为AsyncTaskLoader class LoadMovieList extends AsyncTask<movieListFetcher.listType, Void, Void> { @Override protected Void doInBackground(movieListFetcher.listType... params) { movi
class LoadMovieList extends AsyncTask<movieListFetcher.listType, Void, Void> {
@Override
protected Void doInBackground(movieListFetcher.listType... params) {
movies = null;
switch (params[0]) {
case TOP_RATED:
movies = new movieListFetcher().getTopRatedList();
break;
case MOST_POPULAR:
movies = new movieListFetcher().getMostPopularList();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if (movies != null) {
adapter.notifyDataSetChanged();
recyclerView.setAdapter(adapter);
}
}
}
class LoadMovieList扩展了异步任务{
@凌驾
受保护的Void doInBackground(movieListFetcher.listType…参数){
电影=空;
开关(参数[0]){
外壳顶部额定值:
movies=新的movieListFetcher().getTopRatedList();
打破
最受欢迎的案例:
movies=new movieListFetcher().getMostPopularList();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
如果(电影!=null){
adapter.notifyDataSetChanged();
recyclerView.setAdapter(适配器);
}
}
}
使用AsyncTaskLoader的一般步骤:
public class MovieLoader extends AsyncTaskLoader<List<Movie>> { // STEP 1
private List<Movie> movies;
private int mMovieType;
MovieLoader(@NonNull Context context, Integer movieType) {
super(context);
mMovieType = movieType;
}
@Override
public List<Movie> loadInBackground() {
switch (mMovieType) {
case TOP_RATED:
movies = new movieListFetcher().getTopRatedList();
break;
case MOST_POPULAR:
movies = new movieListFetcher().getMostPopularList();
}
return movies;
}
@Override
protected void onStartLoading() {
super.onStartLoading();
if (movies != null) {
// To skip loadInBackground() call
deliverResult(movies);
} else {
// to run loadInBackground()
forceLoad();
}
}
}
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<Movie>> { // STEP 2
final int LOADER_ID = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// initialize RecyclerView Adapter
// Set RecyclerView mAdapter
mAdapter = new CustomAdapter(...);
RecyclerView recyclerView = findViewById(...);
recyclerView.setAdapter(mAdapter);
// Loading data in background by instantiating a new loader
getSupportLoaderManager().initLoader(LOADER_ID, null, this); // STEP 3
}
@NonNull
@Override
public Loader<List<Movie>> onCreateLoader(int id, Bundle args) {
return new MovieLoader(MainActivity.this, TOP_RATED);
}
@Override
public void onLoadFinished(@NonNull Loader<List<Movie>> loader, List<Movie> movies) {
// Update UI
if (movies != null) {
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onLoaderReset(@NonNull Loader<List<Movie>> loader) {
mAdapter.setMovies(new ArrayList<Movie>()); // create this custom method in your recyclerView adapter
}
}
o步骤1:创建一个自定义加载程序类,该类扩展了AsyncTaskLoader
;
D:是使用loadInBackground()
方法实现的后台任务返回的对象列表;然后重写以下方法:
>在后台运行以加载繁重的工作。。类似于loadInBackground()
AsyncTask
>在创建加载程序之后,在onStartLoading()
loadInBackground()之前运行;可以使用
返回以前加载的结果,或者使用deliverResult()
forceLoad()再次运行后台任务来加载新结果
LoaderCallbacks
。这需要实施3种方法:
>在主线程中运行以创建加载程序实例onCreateLoader()
>在主线程中运行以提交后台结果和更新UI。。类似于onLoadFinished()
AsyncTask
>重置加载程序数据onLoaderReset()
- 注意:(如果您使用的是V4支持库,请确保导入正确的Loader&LoaderManager)
public class MovieLoader extends AsyncTaskLoader<List<Movie>> { // STEP 1
private List<Movie> movies;
private int mMovieType;
MovieLoader(@NonNull Context context, Integer movieType) {
super(context);
mMovieType = movieType;
}
@Override
public List<Movie> loadInBackground() {
switch (mMovieType) {
case TOP_RATED:
movies = new movieListFetcher().getTopRatedList();
break;
case MOST_POPULAR:
movies = new movieListFetcher().getMostPopularList();
}
return movies;
}
@Override
protected void onStartLoading() {
super.onStartLoading();
if (movies != null) {
// To skip loadInBackground() call
deliverResult(movies);
} else {
// to run loadInBackground()
forceLoad();
}
}
}
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<Movie>> { // STEP 2
final int LOADER_ID = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// initialize RecyclerView Adapter
// Set RecyclerView mAdapter
mAdapter = new CustomAdapter(...);
RecyclerView recyclerView = findViewById(...);
recyclerView.setAdapter(mAdapter);
// Loading data in background by instantiating a new loader
getSupportLoaderManager().initLoader(LOADER_ID, null, this); // STEP 3
}
@NonNull
@Override
public Loader<List<Movie>> onCreateLoader(int id, Bundle args) {
return new MovieLoader(MainActivity.this, TOP_RATED);
}
@Override
public void onLoadFinished(@NonNull Loader<List<Movie>> loader, List<Movie> movies) {
// Update UI
if (movies != null) {
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onLoaderReset(@NonNull Loader<List<Movie>> loader) {
mAdapter.setMovies(new ArrayList<Movie>()); // create this custom method in your recyclerView adapter
}
}
第1步:
public class MovieLoader extends AsyncTaskLoader<List<Movie>> { // STEP 1
private List<Movie> movies;
private int mMovieType;
MovieLoader(@NonNull Context context, Integer movieType) {
super(context);
mMovieType = movieType;
}
@Override
public List<Movie> loadInBackground() {
switch (mMovieType) {
case TOP_RATED:
movies = new movieListFetcher().getTopRatedList();
break;
case MOST_POPULAR:
movies = new movieListFetcher().getMostPopularList();
}
return movies;
}
@Override
protected void onStartLoading() {
super.onStartLoading();
if (movies != null) {
// To skip loadInBackground() call
deliverResult(movies);
} else {
// to run loadInBackground()
forceLoad();
}
}
}
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<Movie>> { // STEP 2
final int LOADER_ID = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// initialize RecyclerView Adapter
// Set RecyclerView mAdapter
mAdapter = new CustomAdapter(...);
RecyclerView recyclerView = findViewById(...);
recyclerView.setAdapter(mAdapter);
// Loading data in background by instantiating a new loader
getSupportLoaderManager().initLoader(LOADER_ID, null, this); // STEP 3
}
@NonNull
@Override
public Loader<List<Movie>> onCreateLoader(int id, Bundle args) {
return new MovieLoader(MainActivity.this, TOP_RATED);
}
@Override
public void onLoadFinished(@NonNull Loader<List<Movie>> loader, List<Movie> movies) {
// Update UI
if (movies != null) {
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onLoaderReset(@NonNull Loader<List<Movie>> loader) {
mAdapter.setMovies(new ArrayList<Movie>()); // create this custom method in your recyclerView adapter
}
}
公共类MovieLoader扩展了AsyncTaskLoader{//步骤1
私人电影名单;
私有int类型;
MovieLoader(@NonNull上下文,整数movieType){
超级(上下文);
mMovieType=电影类型;
}
@凌驾
公共列表加载背景(){
开关(MMOVEIE型){
外壳顶部额定值:
movies=新的movieListFetcher().getTopRatedList();
打破
最受欢迎的案例:
movies=new movieListFetcher().getMostPopularList();
}
返回电影;
}
@凌驾
开始加载时受保护的void(){
super.onStartLoading();
如果(电影!=null){
//要跳过loadInBackground()调用
交付结果(电影);
}否则{
//运行loadInBackground()的步骤
力载荷();
}
}
}
第2步和第3步:
public class MovieLoader extends AsyncTaskLoader<List<Movie>> { // STEP 1
private List<Movie> movies;
private int mMovieType;
MovieLoader(@NonNull Context context, Integer movieType) {
super(context);
mMovieType = movieType;
}
@Override
public List<Movie> loadInBackground() {
switch (mMovieType) {
case TOP_RATED:
movies = new movieListFetcher().getTopRatedList();
break;
case MOST_POPULAR:
movies = new movieListFetcher().getMostPopularList();
}
return movies;
}
@Override
protected void onStartLoading() {
super.onStartLoading();
if (movies != null) {
// To skip loadInBackground() call
deliverResult(movies);
} else {
// to run loadInBackground()
forceLoad();
}
}
}
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<Movie>> { // STEP 2
final int LOADER_ID = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// initialize RecyclerView Adapter
// Set RecyclerView mAdapter
mAdapter = new CustomAdapter(...);
RecyclerView recyclerView = findViewById(...);
recyclerView.setAdapter(mAdapter);
// Loading data in background by instantiating a new loader
getSupportLoaderManager().initLoader(LOADER_ID, null, this); // STEP 3
}
@NonNull
@Override
public Loader<List<Movie>> onCreateLoader(int id, Bundle args) {
return new MovieLoader(MainActivity.this, TOP_RATED);
}
@Override
public void onLoadFinished(@NonNull Loader<List<Movie>> loader, List<Movie> movies) {
// Update UI
if (movies != null) {
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onLoaderReset(@NonNull Loader<List<Movie>> loader) {
mAdapter.setMovies(new ArrayList<Movie>()); // create this custom method in your recyclerView adapter
}
}
public类MainActivity扩展AppCompatActivity实现LoaderManager.LoaderCallbacks{//步骤2
最终整数加载器_ID=1;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化RecyclerView适配器
//设置回收视图mAdapter
mAdapter=新的CustomAdapter(…);
RecycleView RecycleView=findViewById(…);
recyclerView.setAdapter(mAdapter);
//通过实例化新加载程序在后台加载数据
getSupportLoaderManager().initLoader(LOADER_ID,null,this);//步骤3
}
@非空
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的MovieLoader(MainActivity.this,顶级);
}
@凌驾
public void onLoadFinished(@NonNull Loader,List movies){
//更新用户界面
如果(电影!=null){
mAdapter.notifyDataSetChanged();
}
}
@凌驾
public void onLoaderReset(@NonNull加载程序){
setMovies(new ArrayList());//在recyclerView适配器中创建此自定义方法
}
}
请注意,现在已弃用装载机,取而代之的是&
希望这能满足您的需要,您可以查看这篇文章以了解更多信息您是否需要知道如何将AsyncTask转换为AsyncTaskLoader?或者需要知道如何处理这种情况下的枚举?我需要知道如何将AsyncTask转换为AsyncTaskLoader,一般来说@دعاءمطى请检查我的答案,希望它能带来好处you@M.Zain非常感谢这很有帮助不客气。。很高兴it帮助显示ViewModel和LiveData可能不推荐使用此选项?