从AsyncTask

时间:2018-04-25 22:49:20

标签: android

我有以下代码:

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

检查主机是否在线,如果其端口80处于打开状态,则在扫描结束时将其全部添加到RecyclerView

我想知道如何添加:

deviceAdapter = new DeviceAdapter(context, deviceList);
recyclerView.setAdapter(deviceAdapter);

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

但没有让我的应用程序崩溃,以便RecyclerView在新项目添加到deviceList<>时立即更新,而不是在任务完成时更新。

1 个答案:

答案 0 :(得分:0)

您的应用程序崩溃,因为只有主线程可以处理<?php session_start(); /* Attempt MySQL server connection. Assuming you are running MySQL server with default setting (user 'root' with no password) */ $link = mysqli_connect("localhost", "root", "root") or die(mysqli_error($db)); mysqli_select_db($link, "keepers") or die(mysqli_error($link)); // Check connection if($link === false) { die("ERROR: Could not connect. " . mysqli_connect_error()); } // Escape user inputs for security if (isset($_POST['submit'])) { $name = mysqli_real_escape_string($link, $_REQUEST['keepername']); $password = mysqli_real_escape_string($link, $_REQUEST['password']); $password2 = mysqli_real_escape_string($link, $_REQUEST['password2']); $email = mysqli_real_escape_string($link, $_REQUEST['accountemail']); $shop = mysqli_real_escape_string($link, $_REQUEST['shopname']); $area = mysqli_real_escape_string($link, $_REQUEST['area']); $address = mysqli_real_escape_string($link, $_REQUEST['address']); $town = mysqli_real_escape_string($link, $_REQUEST['town']); $postcode = mysqli_real_escape_string($link, $_REQUEST['postcode']); $landline = mysqli_real_escape_string($link, $_REQUEST['landline']); $mobile = mysqli_real_escape_string($link, $_REQUEST['mobile']); $shopemail = mysqli_real_escape_string($link, $_REQUEST['shopemail']); $description = mysqli_real_escape_string($link, $_REQUEST['description']); //Error Handlers //Check for empty fields if (empty($name) || empty($password) || empty($email) || empty($shop) || empty($area) || empty($address) || empty($town) || empty($postcode) || empty($shopemail) || empty($description)) { header("Location: keeperregister.php?signup=empty"); exit(); } else { if ($password != $password2) { header("Location: keeperregister.php?signup=passwordnotmatch"); exit(); } else { if (empty($landline) && empty($mobile)) { header("Location: keeperregister.php?signup=bothnumbersnotentered"); exit(); } else { $sql = "SELECT * FROM keepers WHERE keeper_email = '$email'"; $results = mysqli_query($link, $sql) or die (mysqli_error($link)); $resultCheck = mysqli_num_rows($results); if ($resultCheck > 0) { header("Location: keeperregister.php?signup=usertaken"); exit(); } else { $hashedPwd = password_hash($password, PASSWORD_DEFAULT); //Insert the user into the database $sqlinsert = "INSERT INTO keepers VALUES ('NULL','$name', '$hashedPwd', '$email', '$shop', '$area' ,'$address' ,'$town' ,'$postcode' ,'$landline' ,'$mobile' ,'$shopemail', '$description')"; if(mysqli_query($link, $sqlinsert)) { header("Location: registerlogin.php?"); exit(); } else { echo "ERROR: Could not able to execute $sqlinsert. " . mysqli_error($link); } } } } } // close connection mysqli_close($link); } else { header("Location: keeperregister.php"); exit(); } 等UI元素。所以你需要做的是创建一个监听器,只要你<?php session_start(); if (isset($_POST['submit'])) { /* Attempt MySQL server connection. Assuming you are running MySQL server with default setting (user 'root' with no password) */ $link = mysqli_connect("localhost", "root", "root") or die(mysqli_error($db)); mysqli_select_db($link, "keepers") or die(mysqli_error($link)); // Check connection if($link === false) { die("ERROR: Could not connect. " . mysqli_connect_error()); } $name = mysqli_real_escape_string($_POST['keepername']); //$password = mysqli_real_escape_string($link, $_REQUEST['password']); $sql = "SELECT * FROM keepers WHERE keeper_name = '$name'"; $result = mysqli_query($link, $sql); $resultCheck = mysqli_num_rows($result); if ($resultCheck < 1) { header("Location: keeperlogin.php?login=error"); exit(); } else { if ($row = mysqli_fetch_assoc($result)) { //Log in the user here $_SESSION['u_id'] = $row['ID']; $_SESSION['u_name'] = $row['keeper_name']; $_SESSION['u_keeperemail'] = $row['keeper_email']; $_SESSION['u_shopname'] = $row['shop_name']; $_SESSION['u_area'] = $row['area']; $_SESSION['u_address'] = $row['address']; $_SESSION['u_town'] = $row['town/city']; $_SESSION['u_postcode'] = $row['postcode']; $_SESSION['u_landline'] = $row['phone number']; $_SESSION['u_mobile'] = $row['mobile number']; $_SESSION['u_shopemail'] = $row['shop_email']; $_SESSION['u_produce'] = $row['produce']; header("Location: accountmanagement.php?login=success"); exit(); } else { header("Location: keeperlogin.php?login=error"); exit(); } } } ?> 找到一个新设备就会被调用。

示例:

RecyclerView

然后,在RecyclerView所在的Activity或Fragment中,您将实现此侦听器接口,例如:

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")); } } } 方法。

相关问题