2016-03-03 184 views
1

我试图从Service获取一些数据,该数据从坐标获取地址。我跟着一步一步的官方android教程关于这个(http://developer.android.com/training/location),但我卡住了。我使用send方法将Service类中的数据发送到Activity,但onReceiveResult方法似乎没有触发。这是我的Service类:Android:onReceiveResult未触发

public class FetchAddressIntentService extends IntentService { 

protected ResultReceiver mReceiver; 

public FetchAddressIntentService(String name) { 
    super(name); 
} 

public FetchAddressIntentService() { 
    super("FetchAddressIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
    String errorMessage = ""; 

    // Get the location passed to this service through an extra. 
    Location location = intent.getParcelableExtra(Constants.LOCATION_DATA_EXTRA); 
    mReceiver = new ResultReceiver(new Handler()); 
    List<Address> addresses = null; 

    try { 
     addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); //we want 1 result 
    } catch (IOException ioException) { 
     errorMessage = getString(R.string.service_not_available); 
     Log.e("TAG", errorMessage, ioException); 
    } catch (IllegalArgumentException illegalArgumentException) { 
     errorMessage = getString(R.string.invalid_lat_long_used); 
     Log.e("TAG", errorMessage + ". " + "Latitude = " + location.getLatitude() + ", Longitude = " + location.getLongitude(), illegalArgumentException); 
    } 

    if (addresses == null || addresses.size() == 0) { 
     if (errorMessage.isEmpty()) { 
      errorMessage = getString(R.string.no_address_found); 
      Log.e("TAG", errorMessage); 
     } 
     deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage); 
    } else { 
     Address address = addresses.get(0); 
     ArrayList<String> addressFragments = new ArrayList<String>(); 

     for(int i = 0; i < address.getMaxAddressLineIndex(); i++) { 
      addressFragments.add(address.getAddressLine(i)); 
     } 
     Log.i("TAG", getString(R.string.address_found)+": "+addressFragments.get(0)); 
     deliverResultToReceiver(Constants.SUCCESS_RESULT, TextUtils.join(System.getProperty("line.separator"), addressFragments)); 
    } 
} 

private void deliverResultToReceiver(int resultCode, String message) { 
    Bundle bundle = new Bundle(); 
    bundle.putString(Constants.RESULT_DATA_KEY, message); 
    mReceiver.send(resultCode, bundle); 
} 

}

而且我Activity的相关部分:

class AddressResultReceiver extends ResultReceiver { 
    public AddressResultReceiver(Handler handler) { 
     super(handler); 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 

     mAddressOutput = resultData.getString(Constants.RESULT_DATA_KEY); 
     Log.i("address", mAddressOutput); 
     address.setText(mAddressOutput); 

     if (resultCode == Constants.SUCCESS_RESULT) { 
      Toast.makeText(LocationActivity.this, getString(R.string.address_found), 
        Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

你在哪里注册你的接收器在活动? – IgorB

+0

我添加了答案,希望这可以帮助 – IgorB

回答

2

您需要在活动

private AddressResultReceiver mReceiver; 

@Override 
protected void onResume() { 
    super.onResume(); 
    mReceiver = new AddressResultReceiver(new Handler()); 
    mReceiver.setReceiver(this); 
} 

创建接收器,并传递给意向服务

public void onStarService() { 
    final Intent intent = new Intent("SOME_COMMAND_ACTION", null, this, FetchAddressIntentService.class); 
    intent.putExtra("RECEIVER", mReceiver); 
    startService(intent); 
} 

和FetchAddressIntentService

@Override 
protected void onHandleIntent(Intent intent) { 
    final ResultReceiver receiver = intent.getParcelableExtra("RECEIVER"); 
/// your code 
} 
+0

非常感谢,它现在正在工作! – clementino36

1

问题是这一行:

mReceiver = new ResultReceiver(new Handler()); 

这种替换:

mReceiver = intent.getParcelableExtra(Constants.RECEIVER); 

的问题是,你正在创建一个新的ResultReceiver而不是使用可能作为Intent传入的ResultReceiver额外的代码:

protected void startIntentService() { 
    Intent intent = new Intent(this, FetchAddressIntentService.class); 
    intent.putExtra(Constants.RECEIVER, mResultReceiver); 
    intent.putExtra(Constants.LOCATION_DATA_EXTRA, mLastLocation); 
    startService(intent); 
} 

所以,只需使用传入的意图作为额外的意图,它应该工作。

+0

非常感谢,两个答案都有帮助,所以不知道哪一个可以接受,欢呼! – clementino36

+0

@ clementino36一切都好,伊戈尔绝对值得接受,因为他是第一个回答。干杯! –