【问题标题】:Why some lines are not called in my onPostExecute()?为什么在我的 onPostExecute() 中没有调用某些行?
【发布时间】:2016-03-03 13:35:42
【问题描述】:

我现在很困惑。我在 onPostExecute() 中写的一些行没有被调用。这是我的 AsyncTask 代码:

public class GuestInfoTask extends AsyncTask<String, Void, String>
    {
        @Override
        protected String doInBackground(String... params) {
            StringBuilder stringBuilder = new StringBuilder();

            try
            {
                URL url = new URL(params[0]);
                HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

                int charRead;
                char[] charBuffer = new char[500];  // download 500 characters at a time
                while(true)
                {
                    charRead = inputStreamReader.read(charBuffer);
                    if(charRead <= 0)
                        break;

                    stringBuilder.append(String.valueOf(charBuffer), 0, charRead);
                }

                return stringBuilder.toString();
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return null;

            }
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            if(s != null)
            {
                // THIS DOES NOT GET CALLED!
                System.out.println("Successfully retrieved guest info with response: " + s);

                // TODO: parse the data here
                // THIS DOES NOT GET CALLED ALSO!
                System.out.println("TEST: " + s);

                // BUT THIS GETS CALLED
                // alert dialog the response here
                new AlertDialog.Builder(GuestInfoActivity.this)
                        .setTitle("Guest Info")
                        .setMessage("Message: " + s)
                        .setPositiveButton("OK", null)
                        .show();



            }
            else
            {
                System.out.println("Failed to retrieve guest info! Double check your server address and/or network connection!");
                new AlertDialog.Builder(GuestInfoActivity.this)
                        .setTitle("Error")
                        .setMessage("Failed to retrieve guest info! Double check your server address and/or network connection!")
                        .setPositiveButton("OK", null)
                        .show();
            }



            // disable the progressbar after
            mProgressDialog.dismiss();
        }
    }

我有一个button,当点击它时,会执行上面的AsyncTask。现在当任务完成时,我成功地在屏幕上看到了AlertDialog,但我没有看到printLines。我也试过Log.i(),但结果相同。

为什么会这样?我这边有什么问题吗?对于它的价值,我使用的是 Android Studio 1.51 和模拟器 API 19

编辑:我想我已经缩小了罪魁祸首。如果我输入 Log.d("tag", "test"),这会成功显示在日志中。但是如果我键入 Log.d("tag", s),其中s 是 onPostExecute 的结果,我在日志中看不到它。输出 onPostExecute 结果字符串好像有问题?

【问题讨论】:

  • 可能您的 logcat 过滤器级别设置为仅显示更高级别的消息。
  • 清理构建您的项目并在您的设备上再次运行。
  • System.out.println()更改为Log.d("tag", "message");并再次检查是否执行
  • 它被调用,但在你看不到的地方输出
  • 并非所有设备都支持 System.out.println。较旧的 Android API 和/或自定义 rom 不支持它。也许其他设备也是如此。可以肯定的是,请使用 Log。

标签: java android android-asynctask


【解决方案1】:

您指向的行是System.out.println 命令。它们肯定会被调用,但您看不到它们,因为该字符串显示在默认系统输出 (sysout) 中,这不是您在 Android Studio 中看到的控制台。

要在控制台 (logcat) 中查看这些消息,您可以使用 Log 类 (http://developer.android.com/reference/android/util/Log.html) 的方法之一。

所以,试试System.out.println("TEST: " + s),而不是:

Log.i("tag", "TEST: " + s)

请记住,Log.i 在 info 级别打印消息,因此您需要检查您的控制台 (logcat) 是否在该级别显示消息。其他级别是:

Log.v("tag", "TEST: " + s) // VERBOSE
Log.d("tag", "TEST: " + s) // DEBUG
Log.w("tag", "TEST: " + s) // WARNING
Log.e("tag", "TEST: " + s) // ERROR

【讨论】:

  • FWIW,大多数设备都配置了 log.redirect-stdio 系统属性设置为 true,这会将 System.outSystem.err 重定向到具有 INFO 级别的 logcat。 OP 还说他也看不到Log.i() 的输出。
  • 感谢您的信息。我尝试了 Log.d,它现在显示在我的日志中。但我有一个后续问题。我尝试创建一个新函数,然后将 AsyncTask 字符串结果传递给所述函数,并在函数 Log.d 中传递信息。但这并没有出现在我的日志中。有什么想法吗?
  • 我已经编辑了我的原始帖子。我想我已经缩小了罪魁祸首。如果我输入 Log.d("tag", "test"),这会成功显示在日志中。但是如果我输入 Log.d("tag", s),其中s 是 onPostExecute 的结果,我在日志中看不到它。输出 onPostExecute 结果字符串好像有问题?
  • 即使s 字符串为空,您也应该看到该标记。如果你写log.d("tag", "Here is s:" + s)会发生什么?您是否尝试过调试这些行以确保 s 具有值?
  • 是的。我确定s 不为空并且有一个值。因为在写完Log.d 之后,你可以看到我在AlertDialog 中输出了s,我可以在那里看到它的值。太奇怪了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多