2013-02-28 60 views
0

我有一个启动并绑定服务的活动。 该服务使用一些HttpPost执行AsyncTask并处理接收到的数据以从结果中获取一些变量。 如何使用这些数据更新活动中的用户界面,并尽快将服务从HttpPost中获取?我应该使用ResultReceiver还是有更好的方法?使用服务中的AsyncTask接收的数据更新UI

更新

我想我会用的BroadcastReceiver可观察对象

+0

如果绑定,您可以将数据发送回活动 – njzk2 2013-02-28 12:55:52

+0

我必须更新AsyncTask中的接口。我不认为我可以使用债券,对吧? – Nifhel 2013-02-28 16:16:06

回答

1

有一些possibilites:

你的服务可以发送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 
    } 

此链接可以HELO你:http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html

第二种方法是在你的服务上注册一个监听器a nd通知你的服务监听器。

在服务:

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以外发生的事件更新您的用户界面,因此如果您尝试直接更新用户界面,将会遇到问题。要解决此问题,您可以使用您的actitivy的方法runOnUiThread,您可以使用Handler

0

在doInBackground()中下载数据。在onpreExecute()中显示进度对话框。在onPostExecute()中关闭对话框。用onPostExecute()中的数据更新UI。