1

インターネットからデータを取得するスレッドがあります。正しく実行され、データが取得されることを確認します。ただし、データを返す必要があるメソッドを呼び出すと、nullが残ります。それから私は、糸がフィニングの直前にどういうわけか停止しているという結論を導き出しました。

コードは次のとおりです。

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)){
....
4

1 に答える 1

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スレッドで発生し、onPostExecute()メインスレッドで実行されることを忘れないでください。呼び出されるスレッドexecute()はすべてメインスレッドでもある必要があります。メインスレッドの動作方法により、最初onPostCreate()に呼び出すために使用していたコールバックが終了するまで、が発生することは期待できません。execute()だから私はリターンを追加します。

于 2012-10-08T23:25:40.817 に答える