【问题标题】:Lag with asynctask when load data from firebase从 firebase 加载数据时与 asynctask 滞后
【发布时间】:2017-09-10 19:48:02
【问题描述】:

我正在尝试使用 asink 任务从后台 firebase 下载数据并使用它们来创建非专有的 firebase recyclerview。但是,执行后的滞后保持不变。 我不知道我所做的是否正确。

我做错了什么?

公共类 FriendFragmentFollow 扩展片段 {

FriendHoldAdapter3 adapter;
RecyclerView recyclerView;
ArrayList<FriendItem> username;
ArrayList<String> uid, url;
DatabaseReference mDatabase;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {


    return inflater.inflate(R.layout.friend_fragment_follow, container, false);

}

@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SearchView search = (SearchView) view.findViewById(R.id.ciao);

    mDatabase = FirebaseDatabase.getInstance().getReference();


    recyclerView = (RecyclerView) view.findViewById(R.id.friend_list2);
    //recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    recyclerView.setLayoutManager(new GridLayoutManager(view.getContext(), 2));


    new LongOperation().execute("");


    search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (newText.equals("")){
                newText = "             ";
            }
            if (newText.equals("View All")){
                newText = "";
            }
            final List<FriendItem> filteredModelList = filter(username, newText);
            adapter.setFilter(filteredModelList);
            return true;
        }

    });


}


public String getUid() {
    return FirebaseAuth.getInstance().getCurrentUser().getUid();
}

private class LongOperation extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {

        final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-profile");
        mPostReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {



                username = new ArrayList<>();
                uid = new ArrayList<String>();
                url = new ArrayList<String>();

                for (DataSnapshot data : dataSnapshot.getChildren()){
                    final FriendItem friendItem = data.getValue(FriendItem.class);
                    //final String friendItem2 = data.getKey();



                    username.add(friendItem);
                    //uid.add(friendItem2);
                    adapter = new FriendHoldAdapter3(getContext(), username, uid, url);
                    //adapter.setClickListener(FriendActivity3.this);
                    recyclerView.setAdapter(adapter);

                    /**
                     adapter = new FriendHoldAdapter2(FriendActivity2.this, username, uid);
                     adapter.setClickListener(FriendActivity2.this);
                     recyclerView.setAdapter(adapter);
                     **/
                    final List<FriendItem> filteredModelList = filter(username, "        ");
                    adapter.setFilter(filteredModelList);



                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }});

        return "Executed";
    }

    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getContext(), "Post execute", Toast.LENGTH_SHORT).show();


    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Void... values) {}
}

【问题讨论】:

    标签: android android-asynctask android-recyclerview


    【解决方案1】:

    您应该在 onDataChange() 方法中使用 AyncTask。从onDataChanged获取数据后,只需要在后台线程中进行处理即可。试试

    final DatabaseReference mPostReference = FirebaseDatabase.getInstance()
                   .getReference().child("user-profile");
    mPostReference.addListenerForSingleValueEvent(new ValueEventListener() 
    {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                 new LongOperation().execute(dataSnapshot);
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
    });
    
    private class LongOperation extends AsyncTask<DataSnapshot, Void, String> {
    
    @Override
    protected String doInBackground(DataSnapshot... params) {
    
                for (DataSnapshot data : params[0].getChildren()){
                    final FriendItem friendItem = data.getValue(FriendItem.class);
                    //final String friendItem2 = data.getKey();
    
    
    
                    username.add(friendItem);
                    //uid.add(friendItem2);
    
    
    
                }
        return "Executed";
    }
    
    @Override
    protected void onPostExecute(String result) {
                     adapter = new FriendHoldAdapter3(getContext(), username, uid, url);
                    //adapter.setClickListener(FriendActivity3.this);
                    recyclerView.setAdapter(adapter);
    
                    /**
                     adapter = new FriendHoldAdapter2(FriendActivity2.this, username, uid);
                     adapter.setClickListener(FriendActivity2.this);
                     recyclerView.setAdapter(adapter);
                     **/
                    final List<FriendItem> filteredModelList = filter(username, "        ");
                    adapter.setFilter(filteredModelList);
    
        Toast.makeText(getContext(), "Post execute", Toast.LENGTH_SHORT).show();
    
    
    }
    
    @Override
    protected void onPreExecute() {
          username = new ArrayList<>();
          uid = new ArrayList<String>();
          url = new ArrayList<String>();
    }
    
    @Override
    protected void onProgressUpdate(Void... values) {}
    }
    

    【讨论】:

    • 谢谢,但有 2 个错误。在这一行 DataSnapshot data : params[0].getChildren() getChildren 无法识别(它是红色的)。并使用 new LongOperation().execute(dataSnapshot); “无法解析方法”
    • 好的,现在 recyclerView.setAdapter(adapter); 行只有一个错误。方法 setAdapter 必须从 UI 或 UI 线程调用,目前推断线程为 worker...
    • 将其移至执行后
    • Fuziona !!!非常感谢你救了我!你是神!谢谢!!我还有事要问你。我将所有这些都放在选项卡和片段查看器中。当我在选项卡之间移动时,整个 asynktask 被重新加载。有没有办法做到一次并保留它?谢谢
    • 不要在每个片段中都使用它。只需将其放入父活动中,然后在选项卡之间移动时不会执行。它只会在活动开始时调用一次。
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多