我有一个启动并绑定服务的活动。 该服务使用一些HttpPost执行AsyncTask并处理接收的数据以从结果中获取一些变量。 如果服务从HttpPost获取,我怎么能用这些数据更新活动中的UI?我应该使用ResultReceiver还是有更好的方法?
更新:
我想我会使用 BroadcastReceiver 或 Observable对象。
答案 0 :(得分:1)
有一些可能性:
您的服务可以发送brodcast(sendBroadcast),您的活动只需要根据您在服务上实施的注册broacastReceiver。像这样的东西: 您的服务:
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,则会遇到问题。要解决此问题,您可以使用您的actitivy方法runOnUiThread,您可以使用Handler。
答案 1 :(得分:0)
在doInBackground()中下载数据。在onpreExecute()中显示进度对话框。在onPostExecute()中关闭对话框。使用onPostExecute()中的数据更新UI。