我正在使用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方法。
谢谢 海梅
答案 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方法中添加了连接代码。