java - AsyncTask 卡住其线程和 UI 线程

标签 java android multithreading android-asynctask

我创建了一个扩展 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/

相关文章:

java - 使用 HttpGet 和 DefaultHttpClient 的默认超时时间是多少?

android - 以编程方式为支持向量着色

android - IntentService 开始新服务 - 在哪个线程上?

java - Struts2 验证无法正常工作

java - 什么时候需要 Some<E extends Some<E>> 而不是 Some<E extends Some>?

java - 在当前选项卡中打开新页面

android - 自定义 AlertDialog 边框

java - Java Web Start 应用程序中的 HttpsUrlConnection 不信任添加到 Java 控制面板的 SSL 证书

c++ - 如何在不同的 QT 线程中创建一个窗口?

android - 在单独的线程中启动服务