2011-06-30 11 views
0

私は、私のホームネットワーク内のデバイスからいくつかのデータを取得するAsyncTaskを起動するサービスを持っています。 AsyncTaskが完了すると、サービスが実装するonPostExecuteのコールバックインターフェイスを使用して、読み取られたデータをサービスに戻します。サービスは、渡されたStringの情報を読み取り、情報に応じて処理を行います。これは9/10倍になりますが、asynctaskから渡される文字列がnullになることがあります。AndroidのnullstringがAsyncTaskからサービスに渡されました

AsyncTask doInBackground:

private String result = "No results"; 
@Override 
    protected Void doInBackground(Void... params) { 
      try { 
        OutputStreamWriter wr = new OutputStreamWriter(mConnection.getOutputStream()); 
        wr.write(body); 
        wr.flush(); 

        BufferedReader rd = new BufferedReader(new InputStreamReader(mConnection.getInputStream())); 
        String line; 
        while ((line = rd.readLine()) != null) { 
          result = line; 
        } 
        wr.close(); 
        rd.close(); 
      } catch (Exception e) { 
        result = e.getMessage(); 
      } 
      return null; 
    } 

    protected void onPostExecute(Void result) { 
      mListener.onHttpResponse(this.result, REQUEST_CODE); 
    } 

}

サービスonHttpResponse:

@Override 
    public void onHttpResponse(String response, int REQUEST_CODE) { 
      ResponseEnterpreter mEnterpreter = new ResponseEnterpreter(response); 
      switch (REQUEST_CODE) { 
       case WidgetConstants.REQUEST_LED_STATE : 
        String artist = mEnterpreter.getArtist(); <--- NullPointerException 

ResponseEnterpreter getArtist:私の理解へ

public class ResponseEnterpreter { 
    private String mResponse; 


    public ResponseEnterpreter(String mResponse) { 
      this.mResponse = mResponse; 
    } 
     public String getArtist() { 
      int first_index = mResponse.lastIndexOf("&lt;dc:creator&gt;"); 
      if (first_index == -1) { 
        return null; 
      } 

      int last_index = mResponse.lastIndexOf("&lt;/dc:creator&gt;"); 
      String artist = mResponse.substring(first_index + "&lt;dc:creator&gt;".length(), last_index); 

      return unEscapeString(artist); 

    } 

、resul tストリングは「結果なし」として初期化され、バッファドリーダーによって結果が取得されない場合、「結果なし」は渡されるべきストリングです。 mConnectionは3秒のタイムアウトに設定されます。

私は本当にこの上に私の頭を傷つけています....

アイデア?

//フレドリック

答えて

0

onPostExecute方法は、あなたが異なっそれらのメソッドを実装する必要がありますので、値を引数としてdoInBackgroundから返さ取得します:あなたは、すべてのループステップで結果をオーバーライドしている

protected String doInBackground(Void... params) { 
     try { 
       //[..] 

     } catch (Exception e) { 
       return e.getMessage(); 
     } 
     return result; 
} 

protected void onPostExecute(String result) { 
     mListener.onHttpResponse(result, REQUEST_CODE); 
} 

を、あなたが終了します

while ((line = rd.readLine()) != null) { 
    result = line; 
} 
+0

おそらくStringBuilderを使用し、代わりに各ループにbuilder.append(行)を実行してから、次のコードを渡す必要があります。代わりにreturnとしてbuilder.toString()を使用しますか? – Freddroid

+0

StringBuilderはうまくいくはずです。 – thaussma

+0

私は変更を行いました、そして今のところとても良いです。いいぞ! – Freddroid

関連する問題