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,你可能不会这么感到深受,但是这个问题上次确实困扰了一天,把这个经验分享给大家,希望能帮到大家
。因为我也学生还在学习当中,如果有错误和问题希望提出来,我加以改正。