2017-08-09 6 views
4

J'utilise un nouveau thread pour envoyer le fichier, et un peu d'extrait de code pour convertir le bitmap en un fichier. La conversion de bitmap fichier est vraiment lent, et il semble que l'envoi d'informations à clarifai ne fait rien ...Je dois envoyer un fichier image au serveur Clarifai pour la classification des images, mais je reçois toujours des "images sautées, l'application fait trop de travail"

//Convert bitmap to byte array 
      Bitmap bitmap = mResultsBitmap; 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
      byte[] bitmapdata = bos.toByteArray(); 

//write the bytes in file 
      FileOutputStream fos = null; 
      try { 
       fos = new FileOutputStream(f); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      try { 
       fos.write(bitmapdata); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       fos.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       fos.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      final File pFIle2 = f; 
      //TODO: clarifai stuff 
      //TODO: clarifai stuff 
      Log.e("this:"," this is running 0"); 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        Log.e("this:", " this is running 1"); 
        client = new ClarifaiBuilder("mykeyhere1234}").buildSync(); 
        Log.e("this:", " this is running 2"); 
        Thread th = new Thread(new Runnable() { 
         @Override 
         public void run() { 
          Log.e("this:", " this is running 3"); 
          Log.e("this", client.getDefaultModels().generalModel().predict() 
            .withInputs(
              ClarifaiInput.forImage(ClarifaiImage.of(pFIle2)) 
            ) 
            .executeSync().rawBody()); 
          Log.e("this:", " this is running 4"); 
         } 
        }); 


       } 
      }); 

Ce bit d'extrait de code est dans la méthode onActivityResult. Aucun des messages de journal n'imprime sauf "0"

Répondre

1

L'erreur dans votre message de journal est lancé lorsque le client API est incapable d'acquérir des modèles par défaut complets (c.-à-modèle général et d'autres) à partir du serveur après plusieurs tentatives répétées. S'il vous plaît assurez-vous:

  • votre clé API est valide et a des autorisations requises pour prévoir,
  • votre application peut se connecter au serveur Clarifai.

Deux points supplémentaires:

  • Est-ce code en cours d'exécution dans une boucle quelque part? La nouvelle instance ClarifaiBuilder/ClarifaiClient ne devrait être construite qu'une seule fois (probablement au début de l'application).
  • Vous pouvez peut-être simplifier la prédiction d'un fichier local. S'il vous plaît voir this example.
+0

L'exemple est un fichier/repo privé. je ne peux pas y accéder. – McFiddlyWiddly

+0

@McFiddlyWiddly Oups, le lien a été mis à jour. – yper

0

Tout d'abord, vous devez également mettre la conversion de bitmap dans le thread afin qu'il s'exécute de manière asynchrone. Cela permettra d'éviter le message de bégaiement et de trame sautée.

La raison pour laquelle le service Clarifai ne semble pas fonctionner est parce que vous n'avez pas start() le fil. De plus, il n'y a aucune raison de mettre un Thread dans un autre Thread.

Tous ensemble, voici le code fixe:

final Bitmap bitmap = mResultsBitmap; 

final File pFile2 = f; 

ClarifaiClient client = new ClarifaiBuilder("mykeyhere1234}").buildSync(); 

DefaultModels defaultModels = client.getDefaultModels(); 

Log.e("this:"," this is running 0"); 
Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     //Convert bitmap to byte array 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
     byte[] bitmapdata = bos.toByteArray(); 

     //write the bytes in file 
     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream(pFile2); 
      fos.write(bitmapdata); 
     } catch (FileNotFoundException e | IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       fos.flush(); 
       fos.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     //TODO: clarifai stuff 
     //TODO: clarifai stuff 
     Log.e("this:", " this is running 1"); 
     client = 
     Log.e("this:", " this is running 2"); 
     Log.e("this:", " this is running 3"); 
     Log.e("this", models.generalModel().predict() 
       .withInputs(
         ClarifaiInput.forImage(ClarifaiImage.of(pFile2)) 
       ) 
       .executeSync().rawBody()); 
     Log.e("this:", " this is running 4"); 

    } 
}); 

thread.start(); 
+0

Oui, cela a du sens, mais cela ne semble pas fonctionner pour une raison quelconque. Je reçois ce message de journal: https://pastebin.com/PJD73bV9 – McFiddlyWiddly

+0

Cela peut arriver si vous avez appelé le code plus de 100 fois. J'ai modifié la réponse pour refléter la solution mise à jour. – qualverse

0

est est toujours une meilleure pratique de garder le bitmap sur les opérations liées fil d'arrière-plan, essayez cela, vous ne serez pas le journal lié à cadres sautées, faire trop de travail sur fil conducteur. utilise une tâche asynchrone pour effectuer les opérations bitmap.