【问题标题】:AsyncTask OutputStream fails for few devices少数设备的 AsyncTask OutputStream 失败
【发布时间】:2018-06-30 20:20:30
【问题描述】:

我的片段中有两个 AsyncTask。首先加载 (AsyncTask1) 初始数据集,然后在应用向下滚动时加载另一个 (AsyncTask2) 数据。

这两项任务都可以在模拟器(Pixel、Nexus 设备)中完美运行。当我滚动第二个任务时,会无缝加载新数据。

但是当我在 Samsung Note 4、Samsung A5 和另一台设备上运行该应用程序时,AsyncTask1 工作正常,但 AsyncTask2 在以下行之后停止执行。我在 Moto 手机上试了一下,效果很好。

OutputStream outputStream1 = httpURLConnection.getOutputStream();

下面是我的 AsyncTask2 的 doInBackground 方法

@Override
    protected String doInBackground(Integer... args) {
        String arg_item_number = String.valueOf((args[0]*5));
        np_page = args[0];
        String arg_language;

        if (args[1]==1){
            arg_language = "en";
        }else{
            arg_language = "hi";
        }
        try {
            URL url1 = new URL(url_get_next_posts);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url1.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            OutputStream outputStream1 = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter1 = new BufferedWriter(new OutputStreamWriter(outputStream1,"UTF-8"));
            String data_string_language1 = URLEncoder.encode("item_number","UTF-8")+"="+URLEncoder.encode(arg_item_number,"UTF-8")
                    +"&"+URLEncoder.encode("selected_language","UTF-8")+"="+URLEncoder.encode(arg_language,"UTF-8");
            bufferedWriter1.write(data_string_language1);
            bufferedWriter1.flush();
            bufferedWriter1.close();
            outputStream1.close();

            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();

            while ((JSON_NEXT_POST = bufferedReader.readLine()) != null) {
                stringBuilder.append(JSON_NEXT_POST + "\n");
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();

            return stringBuilder.toString().trim();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

错误日志

I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
D/tag_item_count: 1
I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@8bda7dd time:13839484
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
W/System.err: java.net.UnknownHostException: http:websitenname.com/script_url.php
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.createAddress(HttpEngine.java:1347)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:439)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:476)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:118)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:249)
W/System.err:     at com.app_name.android.app_name.PostTab$BackgroundNextPostsJSON.doInBackground(PostTab.java:374)
W/System.err:     at com.app_name.android.app_name.PostTab$BackgroundNextPostsJSON.doInBackground(PostTab.java:347)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err:     at java.lang.Thread.run(Thread.java:818)
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false

会不会和手机上运行的Android版本有关(注4运行的是6.0.1)?我不知道代码有什么问题,因为它实际上适用于模拟器和 Moto 手机。其他非三星设备也会出现此问题吗?

【问题讨论】:

  • @VladMatvienko 感谢您指出这一点。不知何故,我错过了 URL 中的“//”。它开始工作了。有趣的是,它可以在模拟器和少数没有“//”的设备上运行。
  • 我会把我的评论变成答案。我之前没有发布答案,因为我不确定你只是没有偶然展示一个没有 // 的例子。

标签: android android-asynctask


【解决方案1】:

在您的堆栈跟踪中
http:websitenname.com/ 是无效的 URL,因为它在 url 方案中缺少双斜杠。应该是http://websitenname.com/

它可以在模拟器和某些设备上运行,可能是因为它们有一些未记录的改进,并尝试打开无效的 URL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2021-01-22
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多