【问题标题】:AsyncTask in RecyclerViewRecyclerView 中的 AsyncTask
【发布时间】:2015-12-19 16:20:23
【问题描述】:

我在我的应用程序中使用 RecycleView,我想实现 AsyncTask 以便它工作得更快,因为加载片段需要几秒钟。

更具体地说,当单击进入包含 RecyclerView 的片段时,它会挂起几秒钟,我知道通过使用 AsyncTask 它只会加载屏幕上显示的项目,并且只有当我向下滚动时才会加载下一项。所以它会解决延迟...

请问怎么做?

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;
import entities.Order;
import entities.User;

public class HomeFragment extends Fragment implements TransAdapter.ClickListener {

    private RecyclerView rvTrans;
    private TransAdapter adapter;
    private MenuItem mSearchAction;
    private SearchView searchView;
    private ActionBar actionBar;
    private boolean isSearchOpened = false;
    private EditText etSearch;

    public HomeFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        rvTrans = (RecyclerView) view.findViewById(R.id.rv_transactions);
        rvTrans.setLayoutManager(new LinearLayoutManager(getActivity()));
        adapter = new TransAdapter(getActivity());
        adapter.setClickListener(this);
        rvTrans.setAdapter(adapter);
        try {
            adapter.setOrderList(HomeActivity.backEnd.booksForSale());
        } catch (Exception e) {
            Toast.makeText(getActivity().getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
        }
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId())
        {
            case R.id.action_search:
                handleMenuSearch();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        mSearchAction = menu.findItem(R.id.action_search);
        searchView = (SearchView) MenuItemCompat.getActionView(mSearchAction);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                adapter.clearData();
                try {
                    adapter.setOrderList(HomeActivity.backEnd.bookGlobalSearch(query));
                } catch (Exception e) {
                    Toast.makeText(getActivity().getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                }
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
    }

    @Override
    public void itemClicked(Order order) {
        Intent intent = new Intent(getActivity(), DetailsActivity.class);
        intent.putExtra("BOOK_PICTURE", order.getBookPicture());
        intent.putExtra("BOOK_NAME", order.getBookName());
        intent.putExtra("BOOK_AUTHOR", order.getAuthorName());
        intent.putExtra("BOOK_GENRE", order.getGenre());
        intent.putExtra("BOOK_PUBLISHING", order.getPublishingYear());
        startActivity(intent);
    }

    private void handleMenuSearch() {
        actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar(); //get the actionbar

        if(isSearchOpened){ //test if the search is open
            if(actionBar != null)
            {
                actionBar.setDisplayShowCustomEnabled(false);   //disable a custom view inside the actionbar
                actionBar.setDisplayShowTitleEnabled(true);     //show the title in the action bar
            }

            // hides the keyboard
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(etSearch.getWindowToken(), 0);
            isSearchOpened = false;
        } else { // open the search entry
            if(actionBar != null)
            {
                actionBar.setDisplayShowCustomEnabled(true); //enable it to display a
                // custom view in the action bar.
                // action.setCustomView(R.layout.search_bar);//add the custom view

                actionBar.setDisplayShowTitleEnabled(false); //hide the title
            }
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(etSearch, InputMethodManager.SHOW_IMPLICIT);
            isSearchOpened = true;
        }
    }

}

谢谢!

【问题讨论】:

  • 这并不像在 AsyncTask 中使用相同的代码那么简单。您还需要一些逻辑来处理分页,并且每次只获取您想要获取的记录数。

标签: android android-asynctask android-recyclerview


【解决方案1】:

你可能对异步任务的使用感到困惑。

异步任务应该在长时间操作中使用以避免阻塞 UI 线程(例如 http 请求、分页等) 但这并不意味着您的业务逻辑会运行得太快(这将并行运行)。 如果在您的 recyclerView 中您从 url 加载大图像或图像,您需要使用缓存模式直接管理您的逻辑

您可以直接从谷歌开发者http://developer.android.com/training/displaying-bitmaps/process-bitmap.html#async-task 了解这个逻辑在 picasso 或 Processing Bitmaps Off the UI Thread 等项目中的工作原理。

希望这会有所帮助!!!

【讨论】:

    猜你喜欢
    • 2016-11-20
    • 2017-11-20
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多