Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从异步任务内部动态更新RecycleView_Android - Fatal编程技术网

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();
    }

}