如何使用 HttpURLConnection 只发送一个请求

How to send only one Request with HttpURLConnection

我正在使用以下代码向服务器发出请求。我调用了该函数一次,但请求被发送了两次。我从服务器返回的结果是第二次请求的结果

如何只向服务器发送一个请求?

Class 我存储我所有的 runnables:

public class ServerRunnables implements Runnable {
    Account currentAccount = Account.getInstance();

    private String result = "";
    private Context context;
    private Boolean callSuccess = true;

    int serviceCalled;
    String email;
    String password;
    String username;
    int coinChanges;

    String urlString = "http://10.0.2.2/MobileCoin/" + services[serviceCalled];
    String requiredParams;

    public ServerRunnables(Context context,
                           int serviceCalled,
                           String email,
                           String password,
                           String username,
                           int coinChanges) {

        this.context = context;
        this.serviceCalled = serviceCalled;
        this.email = email;
        this.password = password;
        this.username = username;
        this.coinChanges = coinChanges;
    }

    public void run() {
        urlString = "http://10.0.2.2/MobileCoin/" + services[serviceCalled];
        switch (serviceCalled) {
            case SERVICE_RANDOM_COIN:
                generateCoinServiceCalled();
                break;
            default:
                break;
        }
    }



    private void generateCoinServiceCalled() {

        requiredParams = "email=" + email;
        urlString = urlString + "?" + requiredParams;

        getMethodCalled(urlString);

        callSuccess = true;
        String message1 = "";

        if (result.equals(ServerConstants.RANDOM_COIN_EMPTY)) {
            callSuccess = false;
            message1 = "No Data Received";
        } else if (result.equals(ServerConstants.RANDOM_COIN_FAIL)) {
            callSuccess = false;
            message1 = "Data Does not Exist.";
        } else if (result.equals(ServerConstants.CONNECTION_ERROR)) {
            callSuccess = false;
            message1 = "Connection Error, Check Server";
        } else {
            message1 = "Coin Generated : " + Integer.parseInt(result);
        }

        coinChanges(currentAccount.getCoin() + Integer.parseInt(result));
    }

    private void getMethodCalled(String urlString) {
        result = "";

        try {
            URL url = new URL(urlString);

            HttpURLConnection hc = (HttpURLConnection) url.openConnection();
            int length = hc.getContentLength();

            InputStream input = url.openStream();
            byte[] binput = new byte[length];
            int readSize = input.read(binput);

            result = new String(binput).trim();
            input.close();
        } catch (Exception e) {
            Log.e("Net", "Error", e);
            result = ServerConstants.CONNECTION_ERROR;
        }

        Log.i(TAG, result);
    }
}

从这里开始发送请求:

public class ServletsAPI {
    public static Context context;

    public static void randomCoinAPI(String email){
        ServerRunnables newRunnable =
                new ServerRunnables(context, ServerRunnables.SERVICE_RANDOM_COIN, email, null, null, 0);
        new Thread(newRunnable).start();
    }
}

你为什么不使用 Retrofit for handle http request easily? If you integrate with RxJava,你可以异步管理你的请求。

我发现了错误:

InputStream input = url.openStream();

改为

InputStream input = hc.getInputStream();