为什么okhttp3 client.execute不工作?

问题描述 投票:0回答:1

我有一个简单的flask应用,它接收一张图片,并从keras模型中返回预测结果。

烧瓶代码

@app.route('/route', methods=['GET','POST'])
def rose():

    model = load_model('model.h5')
    model.compile(loss='categorical_crossentropy',
                  optimizer='rmsprop',
                  metrics=['accuracy'])

    img_width, img_height = 128, 128
    img = Image.open(request.files['file'])
    if img.mode != "RGB":
        img.convert("RGB")
    img = img.resize((img_width, img_height))

    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)

    images = np.vstack([x])
    classes = model.predict(images)

    return str(classes )

我需要使用camerakit-android从一个android应用程序上传图片:这是我的代码。

package com.bostanji.wardeh.ui.home;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.Image;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.bostanji.wardeh.R;
import com.wonderkiln.camerakit.CameraKitError;
import com.wonderkiln.camerakit.CameraKitEvent;
import com.wonderkiln.camerakit.CameraKitEventListener;
import com.wonderkiln.camerakit.CameraKitImage;
import com.wonderkiln.camerakit.CameraKitVideo;
import com.wonderkiln.camerakit.CameraView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.net.Socket;
import java.util.List;
import java.util.concurrent.TimeUnit;

import dmax.dialog.SpotsDialog;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class HomeFragment extends Fragment {

    private CameraView cameraView;
    private Button button;

    private AlertDialog waitingDialog;
    private Dialog emptyDialog;

    @Override
    public void onResume() {
        super.onResume();
        cameraView.start();
    }

    @Override
    public void onPause() {
        super.onPause();
        cameraView.stop();
    }

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.fragment_home, container, false);
        cameraView = root.findViewById(R.id.camera);
        button = root.findViewById(R.id.btn_detect);
        waitingDialog = new SpotsDialog.Builder().setContext(getContext()).setMessage("Please wait").setCancelable(false).build();

        cameraView.addCameraKitListener(new CameraKitEventListener() {
            @Override
            public void onEvent(CameraKitEvent cameraKitEvent) {

            }

            @Override
            public void onError(CameraKitError cameraKitError) {

            }

            @Override
            public void onImage(final CameraKitImage cameraKitImage) {

                //waitingDialog.show();
                Bitmap bitmap = cameraKitImage.getBitmap();
                final byte[] img = cameraKitImage.getJpeg();
                final Bitmap uploadMap = bitmap;
                bitmap = Bitmap.createScaledBitmap(bitmap, cameraView.getWidth(), cameraView.getHeight(), false);

                cameraView.stop();
                waitingDialog.show();
                final Handler handler = new Handler();



                new Thread(){
                    @Override
                    public void run() {
                        try {


                            OkHttpClient client = new OkHttpClient();

                            String postUrl= "flaskapp.com/route";
                            final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
                            RequestBody req = new MultipartBody.Builder().setType(MultipartBody.FORM)
                                    .addFormDataPart("file","rose.jpeg", RequestBody.create(img, MEDIA_TYPE_JPEG)).build();

                            Request request = new Request.Builder()
                                    .url(postUrl)
                                    .post(req)
                                    .build();

                            try {
                                Response response = client.newCall(request).execute();
                                final String r = response.body().string();


                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        waitingDialog.dismiss();
                                        Toast.makeText(getContext(), r, Toast.LENGTH_LONG).show();

                                    }
                                });

                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        } catch (Exception e) {

                        }
                    }
                }.start();

            }

            @Override
            public void onVideo(CameraKitVideo cameraKitVideo) {

            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cameraView.start();
                cameraView.captureImage();

            }
        });

        return root;
    }


}

一旦我点击按钮拍摄图片并上传,等待对话框就会显示,并且永远保持这样的状态。P.S 我不需要在帖子请求中发送除了图片以外的其他任何东西,并等待响应。

java android flask okhttp
1个回答
0
投票

你使用了一个过时的构造函数,这很容易出错。最好是使用 final Handler handler = new Handler(Looper.getMainLooper()); 此外,你只需在发布请求成功时发布你的消息。如果不成功,等待对话框将永远停留,所以它会更新你的代码。

@Override
public void onImage(final CameraKitImage cameraKitImage) {

 //waitingDialog.show();
 Bitmap bitmap = cameraKitImage.getBitmap();
 final byte[] img = cameraKitImage.getJpeg();
 final Bitmap uploadMap = bitmap;
 bitmap = Bitmap.createScaledBitmap(bitmap, cameraView.getWidth(), cameraView.getHeight(), false);

 cameraView.stop();
 waitingDialog.show();
 final Handler handler = new Handler(Looper.getMainLooper());


 new Thread(){
   @Override
   public void run() {
     try {


       OkHttpClient client = new OkHttpClient();

       String postUrl= "flaskapp.com/route";
       final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
       RequestBody req = new MultipartBody.Builder().setType(MultipartBody.FORM)
                               .addFormDataPart("file","rose.jpeg", RequestBody.create(img, MEDIA_TYPE_JPEG)).build();

       Request request = new Request.Builder()
        .url(postUrl)
        .post(req)
        .build();

       Response response = client.newCall(request).execute();
       final String r = response.body().string();

     } catch (Exception e) {
       Log.e('Camera', 'POST failed', e);
     } finally {
       handler.post(new Runnable() {
          @Override
          public void run() {                                                     
            waitingDialog.dismiss();

            Toast.makeText(getContext(), r, Toast.LENGTH_LONG).show();

          }
        });
     }
   }.start();

 }
© www.soinside.com 2019 - 2024. All rights reserved.