Android 从异步任务内部动态更新RecycleView
我有以下代码:Android 从异步任务内部动态更新RecycleView,android,Android,我有以下代码: protected void onCreate(Bundle savedInstanceState) { RecyclerView recyclerView; DeviceAdapter deviceAdapter; List<Device> deviceList; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
protected void onCreate(Bundle savedInstanceState) {
RecyclerView recyclerView;
DeviceAdapter deviceAdapter;
List<Device> deviceList;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Context context = this;
g.IP = cf.getIP(this);
g.subNet = g.IP.substring(0, g.IP.lastIndexOf(".") + 1);
deviceList = new ArrayList<>();
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
for(int i = 1; i < 256; i++) {
if(cf.isUp(g.subNet + i, 80)) {
deviceList.add(new Device(g.subNet + i, "PAUSED", "N/A"));
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
deviceAdapter = new DeviceAdapter(context, deviceList);
recyclerView.setAdapter(deviceAdapter);
}
}.execute();
}
到doInBackground()
if语句,如下所示:
@Override
protected Void doInBackground(Void... params) {
for(int i = 1; i < 256; i++) {
if(cf.isUp(g.subNet + i, 80)) {
deviceList.add(new Device(g.subNet + i, "UP", "OPEN"));
deviceAdapter = new DeviceAdapter(context, deviceList);
recyclerView.setAdapter(deviceAdapter);
}
}
return null;
}
@覆盖
受保护的Void doInBackground(Void…参数){
对于(int i=1;i<256;i++){
如果(cf.isUp(g.subNet+i,80)){
添加(新设备(g.subNet+i,“向上”,“打开”);
deviceAdapter=新的deviceAdapter(上下文,deviceList);
recyclerView.setAdapter(deviceAdapter);
}
}
返回null;
}
但不会使我的应用程序崩溃,这样当一个新项目添加到
deviceList
,而不是任务完成时,RecyclerView
会立即更新。你的应用程序崩溃,因为只有主线程才能处理诸如RecyclerView
之类的UI元素。因此,您需要做的是创建一个侦听器,每当您的AsyncTask
找到一个新设备时,就会调用该侦听器
例如:
public interface OnDeviceFoundListener {
void onDeviceFound(Device device);
}
@Override
protected void doInBackground(Void... params) {
for (int i = 1; i < 256; i++) {
if (cf.isUp(g.subNet + 1, 80)) {
listener.onDeviceFound(new Device(g.subNet + 1, "UP", "OPEN"));
}
}
}
OnDeviceFoundListener的公共接口{
void onDeviceFound(设备);
}
@凌驾
受保护的void doInBackground(void…参数){
对于(int i=1;i<256;i++){
如果(参见isUp(g子网+1,80)){
onDeviceFound(新设备(g.subNet+1,“向上”,“打开”);
}
}
}
然后,在RecyclerView所在的活动或片段中,您将实现此侦听器接口,例如:
public class MyActivity extends AppCompatActivity implements OnDeviceFoundListener {
private List<Device> devices;
@Override
public void onDeviceFound(Device device) {
devices.add(device);
deviceAdapter = new DeviceAdapter(context, devices);
recyclerView.setAdapter(adapter);
recyclerView.getAdapter().notifyDataSetChanged();
}
}
公共类MyActivity扩展AppCompatActivity实现OnDeviceFoundListener{
私有列表设备;
@凌驾
公用无效onDeviceFound(设备){
设备。添加(设备);
deviceAdapter=新的deviceAdapter(上下文、设备);
recyclerView.setAdapter(适配器);
RecycleView.getAdapter().notifyDataSetChanged();
}
}
添加新设备后,不要忘记在适配器中调用notifyDataSetChanged
方法
public class MyActivity extends AppCompatActivity implements OnDeviceFoundListener {
private List<Device> devices;
@Override
public void onDeviceFound(Device device) {
devices.add(device);
deviceAdapter = new DeviceAdapter(context, devices);
recyclerView.setAdapter(adapter);
recyclerView.getAdapter().notifyDataSetChanged();
}
}