使用服务中的AsyncTask接收的数据更新UI

时间:2013-02-28 12:54:44

标签: android android-asynctask

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

更新

我想我会使用 BroadcastReceiver Observable对象

2 个答案:

答案 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。