同时运行多个Asyntask

时间:2017-10-23 03:47:31

标签: java android multithreading android-asynctask

我想实施一个程序来执行图像识别。如果图像在本地处理,它发送到另一台计算机进行处理,我设置Thread.sleep(1000)并期望第一个图像在本地处理,其他将在localprocessing变量设置为false之前发送。

private class ProcessImageTask extends AsyncTask<ImageItem, Void, ImageItem>{
    @Override
    protected ImageItem doInBackground(ImageItem... params) {
        if(localProcessing==false){
            //**************processing locally*****************
            localProcessing = true;
            try {
                Bitmap bm = BitmapFactory.decodeFile(params[0].getBitmap());

                Bitmap croppedBitmap = getBitmap(getApplicationContext(), INPUT_SIZE, bm);
                final List<Classifier.Recognition> results = classifier.recognizeImage(croppedBitmap);

                String resultStr = results.toString();
                String trimResult = resultStr.substring(resultStr.indexOf("[")+1,resultStr.indexOf("]")).trim();

                String localId = params[0].getId();
                trimResult = trimResult.substring(0,trimResult.indexOf(")")) + " likely)";

                Bitmap thumbnail = getBitmap(getApplicationContext(), 50, bm);
                ImageItem tmp = new ImageItem(localId, imgToString(thumbnail), trimResult);

                Thread.currentThread();
                Thread.sleep(1000);
                localProcessing = false;
                return tmp;
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } else {
            //****************processing on server*************************
            try {
                String ip = strIP;
                int port = 8195;
                Bitmap bm = BitmapFactory.decodeFile(params[0].getBitmap());
                Bitmap croppedBitmap = getBitmap(getApplicationContext(), INPUT_SIZE, bm);
                String encodedImage = "/ID-BEGIN/" + ID + "/ID-END" + imgToString(croppedBitmap);

                try {
                    //**********Send request to server*********
                    Socket socket = new Socket(ip,port);

                    DataInputStream dis = new DataInputStream(socket.getInputStream());
                    DataOutputStream dout = new DataOutputStream(socket.getOutputStream());

                    byte [] messageToServer = encodedImage.getBytes();
                    dout.writeInt(messageToServer.length);
                    dout.write(messageToServer);

                    //Receive response from server
                    int length = dis.readInt();

                    if(length>0) {
                        byte [] message = new byte[length];
                        dis.readFully(message, 0, message.length);

                        String response = new String(message);
                        //Handler updateHandler.post(new updateUIThread(response));

                        Bitmap thumbnail = getBitmap(getApplicationContext(), 50, bm);
                        ImageItem tmp = new ImageItem(params[0].getId(),imgToString(thumbnail), extractServerMessage(response)+"@@");
                        return tmp;
                    }
                    socket.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    @Override
    protected void onPostExecute(ImageItem imageItem) {
        super.onPostExecute(imageItem);
    }
}

我意识到它是按顺序工作的,你能不能告诉我如何修复并使我的同一工作同时工作,即使我设置了Thread.sleep。

非常感谢你。

1 个答案:

答案 0 :(得分:1)

您可能希望在ThreadPool

中同时执行所有Asynctasks
asyncTask1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ....);

AsyncTask.THREAD_POOL_EXECUTOR是常量Executor。如果您对AsyncTask的线程池不满意。您可以通过执行此操作来创建自己的线程池。

Executor myThreadPool = Executors.newFixedThreadPool(numOfPools);

通常,numOfPools取自Runtime.getRuntime().availableProcessors()的可用处理器。

您还需要多少线程。注意电池的使用。更多的计算能力,更多的电池。提醒一下。