Android:AsyncTaks会阻止我的界面

时间:2016-08-19 10:04:21

标签: android android-asynctask

我的asyncTask出了问题。我有自定义USB扫描仪。我想用ToggleButton打开和关闭它。扫描工作正常,但asynctask完全阻止用户界面。我什么都不能做。也许你知道我该怎么做才能让它更好用?

这里有toggleButton:

mScanLayout.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                    task.execute();
                if(!isChecked)
                    task.cancel(true);
            }
        });

这是asynctask:

public class scanAsyncTask extends AsyncTask<Void,Void,Void> {

        @Override
        protected Void doInBackground(Void... params) {
            while(!isCancelled()) {
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        adapter = new PartAdapter(getContext(), R.layout.part_item, mParts, mActivity,this);
                        adapter.startScanning();
                    }
                });
            }
            return null;
        }
    }

这是来自适配器的扫描方法:

public void startScanning(){
        final PendingIntent mPermissionIntent = PendingIntent.getBroadcast(getContext(), 0, new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        getContext().registerReceiver(usbReceiver, filter);
        UsbManager usbManager = (UsbManager) getContext().getSystemService(Context.USB_SERVICE);
        HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        UsbDevice device = null;
        while (deviceIterator.hasNext()) {
            device = deviceIterator.next();
            if (device.getVendorId() == 1659 && device.getProductId() == 8963) {
                this.device = device;
                usbManager.requestPermission(device, mPermissionIntent);
                break;
            }
        }
        final UsbDevice finalDevice = device;
        final UsbDevice finalDevice1 = device;
        UsbConnector.CallbackListener listener = new UsbConnector.CallbackListener() {
            @Override
            public void onStatusChanged(UsbConnector.Status newStatus) {
                Toast.makeText(getContext(), "status: " + newStatus, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onScanCompleted(String result) {
                Toast.makeText(getContext(), "result: " + result, Toast.LENGTH_SHORT).show();

            }
        };

        UsbConnector connector = new UsbConnector(getContext(), finalDevice1,listener);
        connector.run();

        UsbDeviceConnection usbDeviceConnection = usbManager.openDevice(finalDevice);
        UsbSerialDevice serial = UsbSerialDevice.createUsbSerialDevice(finalDevice, usbDeviceConnection);
        serial.open();
        serial.setBaudRate(57600);
        if (finalDevice1 != null) {
            connector.run();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            connector.send(pal);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            byte[] received = connector.receive(36);
            if (received == null) {
                Toast.makeText(getContext(), "BĹ‚Ä…d inicjalizacji skanera", Toast.LENGTH_SHORT).show();
            }
            if (received != null) {
                String response = null;
                long longValue = ByteBuffer.wrap(received).getLong();
                response = Long.toHexString(longValue).toUpperCase();

                if (response.contains("DAAD0674016F6B26")) {
                    connector.send(readId);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    byte[] receivedTag = connector.receive(36);
                    if (receivedTag != null) {
                        String tag = null;
                        long tagValue = ByteBuffer.wrap(receivedTag).getLong();
                        tag = Long.toHexString(tagValue).toUpperCase();
                        if (tag.contentEquals("DAAD046F62ADA900")) {
                            startScanning();
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        if (!tag.contains("DAAD046F62ADA900")) {
                            String tag2 = null;
                            long tagValue2 = ByteBuffer.wrap(receivedTag).getLong();
                            tag2 = Long.toHexString(tagValue2).toUpperCase();
                            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                            Ringtone r = RingtoneManager.getRingtone(getContext(), notification);
                            r.play();
                            int i = 0;
                            for (Part part : mParts) {
                                if(part.getCode().contains(tag2)) {
                                    part.setScan(true);
                                    part.setScanCounter(part.getScanCounter() + 1);
                                    i++;
                                    notifyDataSetChanged();
                                }
                            }
                            if(i==0){
                                Intent intent = new Intent(getContext(),AddActivity.class);
                                intent.putExtra("tag",tag2);
                                mActivity.startActivityForResult(intent,2);
                            }
                        }
                    }
                }
                notifyDataSetChanged();
            }
        } else {
            Toast.makeText(getContext(), R.string.plug_scanner, Toast.LENGTH_SHORT).show();
        }

    }

请帮助。

2 个答案:

答案 0 :(得分:1)

你在doInBackground中的

<xpath expr="//field[@name='product_id']" position="before">
    <field name="image_small" widget="image"/>
</xpath>

这会破坏目的,你不再在后台执行 - 你在主线程上,因此阻止了用户界面

答案 1 :(得分:1)

此代码行

mActivity.runOnUiThread(new Runnable() {

在UI线程上运行你应该在doinbackground返回结果,然后在运行在UI线程上的onPostExecute中使用它。 doInBackground是在不在UI线程上的后台运行,而是强制它在UI线程上运行