2017-10-23 31 views
0

イメージ認識を実行するプログラムを実装したいと思います。画像がローカルで処理されている場合は、処理する別のコンピュータに送信し、Thread.sleep(1000)を設定し、最初の画像がローカルで処理され、otherがlocalprocessing変数がfalseに設定される前に送出されることを期待します。複数のAsyntaskを同時に実行する

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を設定し、同じ時間としてあなたは、私がどのように修正する必要を教えてと異なるタスクの作業を行ってください可能性があり、それは順次取り組んでいる実感。

ありがとうございました。

+0

このタスクをどのように実行しますか? –

答えて

1

はおそらく

asyncTask1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ....); 

AsyncTask.THREAD_POOL_EXECUTORが一定Executorある のThreadPool

で同時にすべてのAsynctasksを実行したいです。あなたがAsyncTaskのスレッドプールで満足していない場合。これを行うことで独自のスレッドプールを作成できます。

Executor myThreadPool = Executors.newFixedThreadPool(numOfPools); 

通常、numOfPoolsRuntime.getRuntime().availableProcessors()によって使用可能なプロセッサから取り出されます。

あなたが望むスレッド数はまだまだです。バッテリの使用に注意してください。より多くの計算能力、より多くのバッテリー。ちょうど思い出させる。

関連する問題