2016-03-03 145 views
-3

我目前困惑。我在onPostExecute()中写入的一些行不会被调用。这里是我的AsyncTask代码:为什么有些行在我的onPostExecute()中没有被调用?

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结果字符串?

+5

可能您的logcat筛选级别设置为仅显示更高级别的消息。 – laalto

+0

清理建立您的项目,并再次在您的设备上运行。 –

+1

将'System.out.println()'改为'Log.d(“tag”,“message”);'如果执行再次检查 – ELITE

回答

2

您指定的行是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被印刷在信息层面的消息,因此,你需要检查你的控制台(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 
+1

FWIW,大多数设备都配置了'log.redirect-stdio'系统属性设置为true,将'System.out'和'System.err'重定向到具有INFO级别的logcat。 OP也表示他也看不到'Log.i()'输出。 – laalto

+0

感谢您的信息。我试过Log.d,它现在显示在我的日志中。但我有一个后续问题。我尝试创建一个新函数,然后将AsyncTask字符串结果传递给上述函数,并在函数Log.d中传递信息。但是这并没有出现在我的日志中。有任何想法吗? – aresz

+0

我编辑了我原来的帖子。我想我已经缩小了罪魁祸首。如果我键入Log.d(“tag”,“test”),则会在日志中成功显示。但是如果我输入Log.d(“tag”,s),其中's'是onPostExecute的结果,我在日志中看不到它。这似乎有一个问题,输出onPostExecute结果字符串? – aresz

相关问题