我有一个启动和绑定服务的活动。该服务使用一些 HttpPost 执行 AsyncTask 并处理接收到的数据以从结果中获取一些变量。服务从 HttpPost 获取数据后,如何使用这些数据更新活动中的 UI?我应该使用 ResultReceiver 还是有更好的方法?
更新:
我想我会使用BroadcastReceiver或Observable 对象。
我有一个启动和绑定服务的活动。该服务使用一些 HttpPost 执行 AsyncTask 并处理接收到的数据以从结果中获取一些变量。服务从 HttpPost 获取数据后,如何使用这些数据更新活动中的 UI?我应该使用 ResultReceiver 还是有更好的方法?
更新:
我想我会使用BroadcastReceiver或Observable 对象。
有一些可能:
您的服务可以发送广播(sendBroadcast),您的活动只需要根据您在服务上实现的注册一个广播接收器。类似的东西:您的服务:
Intent intent = new Intent();
intent.setAction("youAction");
intent.putExtra("url",uri.toString());
sendBroadcast(intent);
在您的应用程序的 AndroidManifest 上:
<receiver android:name="MyReceiver" >
<intent-filter>
<action android:name="yourAction" />
</intent-filter>
</receiver>
您的活动:
private class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String url = arg1.getExtras().getString("url");
//Here you can update your UI
}
这个链接可以帮助你:http ://www.vogella.com/articles/AndroidBroadcastReceiver/article.html
第二种方法是在您的服务上注册一个侦听器并在您的服务上通知该侦听器。
在您的服务中:
void onSomethingHappened()
{
activityListener.notifyProgressBar();
}
void subscribe(YourInterface listener)
{
actibityListener = listener;
}
In you activity, after start you service:
service.subscribe(this);
但是,要采用更好的解决方案,您应该考虑您的服务实现(类型)。
这个关于AndroidService的链接很有用。
但是,另一个重要的一点是,您的选择取决于您如何实现异步任务。取决于您对每个方法执行的操作,preExucute、doInBackground、onProgressUpdate 和 postExecute。
您必须记住,您将从 AndroidUIThread 之外发生的事件更新您的 UI,因此如果您尝试直接更新您的 UI,您会遇到问题。要解决此问题,您可以使用您的活动的 runOnUiThread 方法,也可以使用Handler。
在 doInBackground() 中下载数据。在 onpreExecute() 中显示进度对话框。在 onPostExecute() 中关闭对话框。使用 onPostExecute() 中的数据更新 UI。