RecyclerView獲取ssm框架傳過來的值
- 第一步:RecyclerView的使用,
- 第二步:runOnUiThread方法的作用,
- 第三步:如何獲取多執行緒的值,
- 正確的形式
- 錯誤形式
關于這個問題主要我在用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,你可能不會這么感到深受,但是這個問題上次確實困擾了一天,把這個經驗分享給大家,希望能幫到大家,因為我也學生還在學習當中,如果有錯誤和問題希望提出來,我加以改正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/241039.html
標籤:其他
