2016-03-03 147 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

相關問題