私は、私のホームネットワーク内のデバイスからいくつかのデータを取得する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("<dc:creator>");
if (first_index == -1) {
return null;
}
int last_index = mResponse.lastIndexOf("</dc:creator>");
String artist = mResponse.substring(first_index + "<dc:creator>".length(), last_index);
return unEscapeString(artist);
}
、resul tストリングは「結果なし」として初期化され、バッファドリーダーによって結果が取得されない場合、「結果なし」は渡されるべきストリングです。 mConnectionは3秒のタイムアウトに設定されます。
私は本当にこの上に私の頭を傷つけています....
アイデア?
//フレドリック
おそらくStringBuilderを使用し、代わりに各ループにbuilder.append(行)を実行してから、次のコードを渡す必要があります。代わりにreturnとしてbuilder.toString()を使用しますか? – Freddroid
StringBuilderはうまくいくはずです。 – thaussma
私は変更を行いました、そして今のところとても良いです。いいぞ! – Freddroid