Android 如何将此asyncTask转换为AsyncTaskLoader?

Android 如何将此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

由于movieListFetcher.listType是枚举,如何将此AsyncTask代码转换为AsyncTaskLoader

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()再次运行后台任务来加载新结果
o步骤2:在需要后台流程的活动中实施
LoaderCallbacks
。这需要实施3种方法:

  • onCreateLoader()
    >在主线程中运行以创建加载程序实例
  • onLoadFinished()
    >在主线程中运行以提交后台结果和更新UI。。类似于
    AsyncTask

  • onLoaderReset()
    >重置加载程序数据

o第3步:在活动中需要加载程序时,使用LoaderManager启动加载程序:

  • 注意:(如果您使用的是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可能不推荐使用此选项?