4

我正在使用一个新线程来发送文件,并使用一些代码片段将位图转换为文件。从位图到文件的转换真的很慢,似乎将信息发送到 clarifai 并没有做任何事情......

//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");
                        }
                    });


                }
            });

这段代码片段在 onActivityResult 方法中。除了“0”之外,没有任何日志消息正在打印

4

3 回答 3

1

当 API 客户端在多次重复尝试后无法从服务器获取完整的默认模型(即通用模型和其他模型)时,将引发日志消息中的错误。请确保:

  • 您的 API 密钥有效并且有权进行预测,
  • 您的应用程序能够连接到 Clarifai 服务器。

补充两点:

  • 这段代码是否在某处循环运行?新的ClarifaiBuilder/ClarifaiClient实例应该只构造一次(可能在应用程序开始时)。
  • 您也许可以简化预测本地文件。请看这个例子
于 2017-08-18T06:29:34.457 回答
0

将位图相关操作保留在后台线程上始终是最佳实践,尝试这样做您不会得到与跳帧相关的日志,在主线程上做太多工作。使用异步任务来执行位图操作。

于 2017-08-21T10:28:58.523 回答
0

首先,您应该将位图转换也放入线程中,使其异步运行。这将防止出现口吃和跳帧消息。

Clarifai 服务似乎无法正常工作的原因是您没有start()使用 Thread。此外,没有理由将一个线程放在另一个线程中。

总之,这是固定代码:

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();
于 2017-08-14T19:26:47.863 回答