如何在不使用AsyncTask的情况下在Android中发送发布请求

时间:2020-08-24 21:35:16

标签: java android okhttp

我正在使用HttpURLConnection向服务器发出发布请求,但出现异常,这是无法在UI线程上进行的。

我一直在寻找信息,但是我只使用AsyncTask类找到了信息,但是根据Android文档,该类已被弃用,我应该改用java.util.concurrent

我发现了很多信息(例如,完整的HttpClient类或使用外部库),但是这些信息都没有一件简单的事情即可将发布请求发送到URL。

您能指出我正确的方向吗?

这是我需要异步调用的整个类:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;

public class ServerConnection {
    private String absoluteUrl;
    String parameters;

    public ServerConnection(String postUrl, HashMap<String, String> keyValuePairs)
    {
        absoluteUrl = postUrl;

        StringBuilder sbParams = new StringBuilder();
        int i = 0;
        for (String key : keyValuePairs.keySet()) {
            try {
                if (i != 0){
                    sbParams.append("&");
                }
                sbParams.append(key).append("=")
                        .append(URLEncoder.encode(keyValuePairs.get(key), "UTF-8"));

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            i++;
        }

        parameters = sbParams.toString();
    }

    public boolean Send()
    {
        HttpURLConnection conn = null;

        try {
            URL urlObj = new URL(absoluteUrl);
            conn = (HttpURLConnection) urlObj.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Accept-Charset", "UTF-8");

            conn.setReadTimeout(10000);
            conn.setConnectTimeout(15000);

            conn.connect();

            DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
            wr.writeBytes(parameters);
            wr.flush();
            wr.close();

            InputStream in = new BufferedInputStream(conn.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }

            return result.toString().equals("OK");
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return false;
        } catch (ProtocolException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }

    }

}

此外,这也是一个lib项目,我也将呼吁iOS应用程序,这就是为什么我正在寻找一种标准的Java方法。

谢谢 海梅

2 个答案:

答案 0 :(得分:0)

正如文档所述AsyncTask现在已过时,您需要使用java.util.concurrent,这是一个有用的库,名为ObservableScheduler,可让您使用java.util.concurrent

implementation 'com.jiang.android.observablescheduler:schedule:1.0.1'

示例:

  public void send() {
        JObservable.create(new JObservable.OnSubscribe<StringBuilder>() {
            @Override
            public void call(SubscribeManager<StringBuilder> mSubscriber) {
                try {

                    HttpURLConnection conn = null;
                    URL urlObj = new URL(absoluteUrl);
                    conn = (HttpURLConnection) urlObj.openConnection();
                    conn.setDoOutput(true);
                    conn.setRequestMethod("POST");
                    conn.setRequestProperty("Accept-Charset", "UTF-8");
                    conn.setReadTimeout(10000);
                    conn.setConnectTimeout(15000);
                    conn.connect();
                    DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
                    wr.writeBytes(parameters);
                    wr.flush();
                    wr.close();
                    InputStream in = new BufferedInputStream(conn.getInputStream());
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder result = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        result.append(line);
                    }
                    mSubscriber.notifyData(result);
                } catch (Exception e) {
                    mSubscriber.error(e);
                }
            }
        }).workedOn(Schedules.background())
                .subscribeOn(Schedules.mainThread())
                .subscribe(new Subscriber<StringBuilder>() {
                    @Override
                    public void notifyData(StringBuilder result) {
                        //DO YOUR STUFF HERE
                    }

                    @Override
                    public void error(Throwable t) {
                        Toast.makeText(context, "Ops ! " + t.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
    }

答案 1 :(得分:0)

我刚刚创建了一个Thread对象,并在run方法中添加了连接代码。