我创建了一个扩展 AsyncTask
的类,以从我的应用程序向我的服务器发送 POST 请求。到目前为止它一直在工作。我没有更改任何内容,但当我尝试执行它时,它突然卡住了 UI 线程及其自己的线程。
我尝试使用Log.d()
来找出它在卡住之前将您带到哪里,结果发现它在doInBackground()
之后立即卡住被调用。
我也尝试过改变这个...
字符串结果 = new AsyncPost().execute(params).get();
对此...
AsyncTask task = new AsyncPost();
task.execute();
String result = task.get();
这与我给它的参数无关,因为无论传递给它什么参数它都会卡住。
我还尝试使用 Postman 来检查我的服务器是否正常工作(确实如此),所以这也不是服务器端问题。
这是我的 AsyncTask
类。抱歉代码量过多,但我无法弄清楚它的哪个具体部分是不好的,因为到目前为止它都在工作。
public class AsyncPost extends AsyncTask<Object, Integer, String> {
@Override
protected String doInBackground(Object ... params){
//android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE);
Object urlObj = params[0];
Object argsObj = params[1];
String urlStr = (String) urlObj;
Map<String, String> args = (Map<String, String>) argsObj;
URL url;
HttpsURLConnection http = null;
byte[] out = null;
int len = 0;
Log.d("POST", "STARTED");
try {
url = new URL(urlStr);
http = (HttpsURLConnection) url.openConnection();
http.setRequestMethod("POST");
http.setDoOutput(true);
StringJoiner sj = new StringJoiner("&");
for (Map.Entry<String, String> entry : args.entrySet()) {
sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "="
+ URLEncoder.encode(entry.getValue(), "UTF-8"));
}
out = sj.toString().getBytes(StandardCharsets.UTF_8);
len = out.length;
http.setFixedLengthStreamingMode(len);
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
http.connect();
Log.d("POST", "CONNECTED");
}
catch (Exception e){
e.printStackTrace();
return null;
}
try (OutputStream os = http.getOutputStream()){
os.write(out);
}
catch (Exception e){
e.printStackTrace();
return null;
}
try {
Log.d("POST_RESPONSECODE", Integer.toString(http.getResponseCode()));
BufferedReader responseReader = new BufferedReader(new InputStreamReader(http.getInputStream()));
StringBuilder responseBuilder = new StringBuilder();
String response;
while ((response = responseReader.readLine()) != null){
responseBuilder.append(response);
}
Log.d("POST", responseBuilder.toString());
return responseBuilder.toString();
}
catch (Exception e){
e.printStackTrace();
return null;
}
finally{
http.disconnect();
}
}
@Override
public void onProgressUpdate(Integer ... progress){
Log.d("POST", "PROGRESS = " + Integer.toString(progress[0]));
}
}
我应该怎么做才能解决这个问题?
我是否应该使用 AsyncTask
来完成此任务。我尝试过使用 Thread
,但这也会卡住我的 UI。
我看过其他问题,但他们似乎都在这样做......
对象结果 = new AsyncTask().get();
这就是造成他们问题的原因,但这不适用于我。
最佳答案
在 AsyncTask 上调用 get() 基本上会阻止该线程(在您的情况下是主线程)上的执行。 相反,您想要做的是在 AsyncTask onPostExecute() 方法中实现 ( https://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result) )
关于java - AsyncTask 卡住其线程和 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45677693/