RecylerView与多线程的“爱恨情仇”,怎么让你的RecyclerView获取ssm框架传过来的值?


关于这个问题主要我在用ssm框架的时候, 想在android端取到ssm框架传过来的数据,然后把数据传给RecylerView显示出来。然后遇到了很多问题,最近问了一下老师说需要用到 runOnUiThread方法,其实老师以前说过,但是我用的少,所以就忘记了。废话不多说,直接步入正题。

第一步:RecyclerView的使用。

这个我就不多说,一般可以想实现RecylerView和多线程的传值,对于RecyclerView的使用多少有点了解。
如果你想巩固一下RecyclerView的使用了,可以看一下我们老师的这篇博客非常详细Android RecyclerView最全使用详解

第二步:runOnUiThread方法的作用。

笼统的解释:在Android开发的过程中,主线程主要来完成UI绘制和响应用户的操作,默认情况下,我们大部分的代码都是在主线程中执行的,因此我们时刻要考虑主线程的情况。我们都知道要开启一个子线程来完成一个耗时操作,以避免阻塞主线程影响用户体验,甚至ANR。但是子线程执行完要更新UI的时候,我们又必须回到主线程来更新,实现这一功能常用的方法是执行Activity的runOnUiThread()方法。

我觉得主要就是使用子线程的数据来更新主线程的数据的意思吧。

第三步:如何获取多线程的值。

代码如下:

package com.example.reclycleview_thread;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    
    
    RecyclerView mRecyclerView;
    MyAdapter mMyAdapter ;
    List<String> list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView=findViewById(R.id.recycleView);
        Data();
    }

    class MyAdapter extends RecyclerView.Adapter<MyViewHoder> {
    
    
        @NonNull
        @Override
        public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
            View view = View.inflate(getApplicationContext(), R.layout.layout_thread, null);
            MyViewHoder myViewHoder = new MyViewHoder(view);
            return myViewHoder;
        }

        @Override
        public void onBindViewHolder(@NonNull MyViewHoder holder, int position) {
    
    
            holder.textView.setText(list.get(position));
        }

        @Override
        public int getItemCount() {
    
    
            return list.size();
        }
    }

    class MyViewHoder extends RecyclerView.ViewHolder {
    
    
        TextView textView;

        public MyViewHoder(@NonNull View itemView) {
    
    
            super(itemView);
            textView=itemView.findViewById(R.id.textView);
        }
    }

    public void Data(){
    
    
        new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                List<String> date=new ArrayList<>();
                for(int i=0;i<100;i++){
    
    
                    date.add(String.valueOf(i));
                }
                try {
    
    
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
    
    
                    @Override
                    public void run() {
    
    
                        list = date;
                        mMyAdapter = new MyAdapter();
                        mRecyclerView.setAdapter(mMyAdapter);
                        LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
                        mRecyclerView.setLayoutManager(layoutManager);
                    }
                });
            }
        }).start();
    }

}

代码解析:
可以根据上面的所有代码来看,这样效果清楚一点,因为我这里是模拟ssm框架的传值,因为我们一般要使用ssm框架进行增删改查等操作分为三种情况
1.只从获取ssm框架传过来的数据。例如:查询所有数据
2.你传一个数据给ssm框架,然后ssm会传相应的数据给你。例如:查询功能。
3.你只传数据给ssm框架。例如:添加功能。
一般这些获取方式都有延时,不会即时获取数据,所以我用Threa.sleep()方法进行延时模拟操作
在这里插入图片描述

为什么要把上图最下方红色圆圈中方法放到runOnUiThread中呢,我给你演示一下,如果没有把上图方法放到runOnUiThread的方法吧,毕竟实践出真知

正确的形式

正确的形式就是如下图,把MyAdapter,LinerLayoutManager方法放到runOnUiThread方法种的形式,把它们放到主线程中的形式

在这里插入图片描述
然后我们看一下效果,两秒钟之后RecyclerView获取到了模拟的数据。因为最近我的手机模拟器坏了,只能用本机来演示,但是本机我不知道怎么拍gif图,所以只能传一张照片了,你们也可以自己去测试一下。
在这里插入图片描述

错误形式

错误的形式就不把MyAdapter,LinerLayoutManager方法放到runOnUiThread方法种的形式。如图所示。
在这里插入图片描述
在这里插入图片描述
看一下效果,我们可以看到接收不到数据,我几乎等了10秒还是没有数据,如图所示:

在这里插入图片描述

,
如果你没怎么用过ssm框架传值给RecyclerView,你可能不会这么感到深受,但是这个问题上次确实困扰了一天,把这个经验分享给大家,希望能帮到大家。因为我也学生还在学习当中,如果有错误和问题希望提出来,我加以改正。

猜你喜欢

转载自blog.csdn.net/qq_45137584/article/details/111718486