2012-10-08 153 views
1

我有一個線程從互聯網上獲取一些數據。它接近它正確執行並檢索數據。但是,如果我調用一個應該返回數據的方法,那麼我就會留下空值。從那裏我得出結論,線程在finning之前不知何故停止。爲什麼Android線程在完成執行之前被終止?

下面是代碼:

private class getHash extends AsyncTask<String, Void, String>{ 
    @Override 
    protected String doInBackground(String... params) { 
     String str = null; 
     try { 
      // Create a URL for the desired page 
      URL url = new URL(params[0]); 

      // Read all the text returned by the server 
      InputStream is = url.openStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader in = new BufferedReader(isr); 
      str = in.readLine(); 
      is.close(); 
      isr.close(); 
      in.close(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     hash = str; //If I set a global variable here it gets passed without a hitch 
     return str; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     hash = result; // If I comment the line above and live this one I left with a null 
    } 
} 

編輯: 根據要求添加代碼,其中線程被稱爲:

  getHash hashThread = new getHash(); 
      hashThread.execute(new String[] {"http://www.full.path/to/the/file.hash"}); 


      if(hash != null && !hash.equals(localHash)){ 
.... 
+2

「從這裏我得出結論,線程在finning之前就停止了。」 - 或者,你有一個例外。 – CommonsWare

+0

您如何檢索價值以證明它在完成之前確實停止。 –

+0

不@CommonsWare我真的得出了一個結論,我沒有看到異常。 GregGiacovelli如果您可能將您的注意力引向我給出的代碼示例,最後您會找到兩行,並附上一些解釋性評論。 – PovilasID

回答

1

不管推出的AsyncTask現在

{ 
.... 
getHash hashThread = new getHash(this); 
hashThread.execute(new String[] {"http://www.full.path/to/the/file.hash"}); 
return; // ok now we just have to wait for it to finish ... can't read it until then 
} 

// Separate callback method 
public void onHashComplete(String hash) { 

    if(hash != null && !hash.equals(localHash)) { 
     .... 
    } 
    .... 
} 

在你的GetHash類

public String doInBackground(String[] params) { 
    .... // don't set hash here ... it will work but you will probably read it at the wrong time. 
    return str; 
} 

public void onPostExecute(String str) { 
    onHashComplete(str); // or just do all the work in here since it is a private inner class 
} 

....

希望幫助。記住doInBackground()發生在AsyncTask線程上,在主線程上執行。無論什麼線程調用​​也應該是主線程。由於主線程的工作方式,您不能期望onPostCreate()發生,直到它首先調用​​時使用的任何回調完成爲止。所以這就是爲什麼我添加回報。

+0

感謝您的清除。我一定是錯過了那部分,同時閱讀了關於線程的內容,並衝向了開發。 – PovilasID

相關問題