title: AsynTask with RemoteViews in StackView Widget
body: <p>I've tried to search for information about StackView Widget and i've found a lot , but nobody used to get data from url .
  So the problem is , while i'm processing url , my RemoteViews are null , so they don't show nothing. Once the process is done i want to <strong>update that RemoteViews from asyntask</strong> (there are in the same class). <strong>How can i do that ? Or syncronize them ?</strong></p>
  
  <p>Here's my code for Widget service: </p>
  
  <pre><code>public class RSSService extends RemoteViewsService {
  
  private ManagerRSS mr;
  private Cursor c;
  private int lenght;
  private List&lt;Provider&gt; mWidgetItems = new ArrayList&lt;Provider&gt;();
  private RemoteViews rv = null;
  public ArrayList&lt;Item&gt; result = new ArrayList&lt;Item&gt;();
  private boolean isFinished = false;
  
  @Override
  public void onCreate() {
      // TODO Auto-generated method stub
      mr = new ManagerRSS(this.getApplicationContext());
      mr.open();
      mr.openRead();
      c = mr.getCursor();
      lenght = c.getCount();
  }
  
  @Override
  public void onDestroy() {
      // TODO Auto-generated method stub
      c.close();
      mr.close();
      super.onDestroy();
  }
  
  @Override
  public RemoteViewsFactory onGetViewFactory(Intent intent) {
      // TODO Auto-generated method stub
      return new RSSRemoteViewsFactory(this.getApplicationContext(), intent);
  }
  
  class RSSRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory{
  
      private Context mContext;
      private int mAppWidgetId;
  
  
      public RSSRemoteViewsFactory(Context applicationContext, Intent intent) {
          // TODO Auto-generated constructor stub
          mContext = applicationContext;
          mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                  AppWidgetManager.INVALID_APPWIDGET_ID);
      }
  
      @Override
      public int getCount() {
          // TODO Auto-generated method stub
          return lenght;
      }
  
      @Override
      public long getItemId(int arg0) {
          // TODO Auto-generated method stub
          return arg0;
      }
  
      @Override
      public RemoteViews getLoadingView() {
          // TODO Auto-generated method stub
          return null;
      }
  
      @Override
      public RemoteViews getViewAt(int position) {
          if(isFinished){
              rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
              rv.setTextViewText(R.id.widget_item, mWidgetItems.get(position).getTitle());
              if(mWidgetItems.get(position).getTitle().equals("El Pais")){
                  rv.setImageViewResource(R.id.iNotice, R.drawable.elpais);
              }else if(mWidgetItems.get(position).getTitle().equals("Marca")){
                  rv.setImageViewResource(R.id.iNotice, R.drawable.marca);
              }else if(mWidgetItems.get(position).getTitle().equals("As")){
                  rv.setImageViewResource(R.id.iNotice, R.drawable.as1);
              }else if(mWidgetItems.get(position).getTitle().equals("Ideal")){
                  rv.setImageViewResource(R.id.iNotice, R.drawable.ideal);
              }else{
                  rv.setImageViewResource(0, R.drawable.undefined);
              }
              rv.setTextViewText(R.id.tvLastNotice, result.get(position).getTitle());
              rv.setTextViewText(R.id.tvLastNoticePublish, result.get(position).getPubDate());
              Bundle extras = new Bundle();
              extras.putString(Widget.NAME_DIARY, mWidgetItems.get(position).getTitle());
              Intent fillInIntent = new Intent();
              fillInIntent.putExtras(extras);
              rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
              try {
                  System.out.println("Loading view " + position);
                  Thread.sleep(500);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
  
              return rv;
          }else{
              return null;
          }
  
      }
  
      @Override
      public int getViewTypeCount() {
          // TODO Auto-generated method stub
          return 1;
      }
  
      @Override
      public boolean hasStableIds() {
          // TODO Auto-generated method stub
          return true;
      }
  
      @Override
      public void onCreate() {
          while(c.moveToNext()){
              String title = c.getString(c.getColumnIndex(Contrato.TableRSS.TITLE));
              String link = c.getString(c.getColumnIndex(Contrato.TableRSS.LINK));
              long _id = c.getLong(c.getColumnIndex(Contrato.TableRSS._ID));
              mWidgetItems.add(new Provider(_id, title, link));
              executeThread(link, c.getPosition());
          }
      }
  
      void executeThread(String type_link,int position){
          myThread exe = new myThread();
          exe.setOnlyFirst(true);
          exe.execute(new String[]{type_link});
      }
  
      private class myThread extends MyAsyncTask{
  
          @Override
          protected void onPostExecute(ArrayList&lt;Item&gt; result2) {
              // TODO Auto-generated method stub
              super.onPostExecute(result2);
              for(int i=0;i&lt;result2.size();i++) result.add(result2.get(i));
              if(result.size()+1 == c.getCount()) isFinished = true;
          }
      }
  
      @Override
      public void onDataSetChanged() {
  
      }
  
      @Override
      public void onDestroy() {mWidgetItems.clear();}
  
  }
  </code></pre>
  
  <p>}</p>
  
  <p>And this is my WidgetProvider :</p>
  
  <pre><code>public class Widget  extends AppWidgetProvider{
  
  public static final String ON_TOUCH = "com.cool.nightrss.ON_TOUCH";
  public static final String ID_DIARY = "com.cool.nightrss.ID_DIARY";
  public static final String ID_NOTICE = "com.cool.nightrss.ID_NOTICE";
  public static final String NAME_DIARY = "com.cool.nightrss.NAME_DIARY";
  public static final String LINK_NOTICE = "com.cool.nightrss.LINK_NOTICE";
  
  @Override
  public void onReceive(Context context, Intent intent) {
      // TODO Auto-generated method stub
      if (intent.getAction().equals(ON_TOUCH)) {
          int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                  AppWidgetManager.INVALID_APPWIDGET_ID);
          String name = intent.getStringExtra(NAME_DIARY);
          Toast.makeText(context, "Touched view " + name +" ID "+appWidgetId, Toast.LENGTH_SHORT).show();
      }
      super.onReceive(context, intent);
  }
  
  @SuppressWarnings("deprecation")
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
          int[] appWidgetIds) {
      // TODO Auto-generated method stub
      for (int i = 0; i &lt; appWidgetIds.length; ++i) {
  
          Intent intent = new Intent(context, RSSService.class);
          intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
  
          intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
          RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
          rv.setRemoteAdapter(appWidgetIds[i], R.id.stack_view, intent);
  
          Intent toastIntent = new Intent(context, Widget.class);
          toastIntent.setAction(Widget.ON_TOUCH);
          toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
          intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
          PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
                  PendingIntent.FLAG_UPDATE_CURRENT);
          rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);
  
          appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
      }
      super.onUpdate(context, appWidgetManager, appWidgetIds);
  }
  </code></pre>
  
  <p>}</p>