отображение из асинтаксической задачи в службу намерений

У меня есть виджет приложения для Android, в котором я использовал асинхронную задачу для своих сетевых вызовов. СЕЙЧАС я хочу перевести свои звонки с асинтаксиса на обслуживание намерений. Работа doInBackground () может выполняться в onHandleIntent (), но как насчет onPreExecute () и onPostExecute (). У меня есть штрих-код выполнения в этих двух методах, чтобы дать моей кнопке обновления вращающийся эффект. Где мне поместить код для этого в сервисе намерений?

ОБНОВИТЬ

public class StoreWidgetProvider extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

        super.onUpdate(context, appWidgetManager, appWidgetIds);
        updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_main_layout1);
        mContext = context;
        mProgressBar = new ProgressBar(context);

        Intent localIntent = new Intent(context,StoreWidgetService.class);

        context.startService(localIntent);
//      try {
//          fetchTask.execute().get();
//      } catch (InterruptedException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      } catch (ExecutionException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }

        MyCurrentLocation(mContext);
        imageLoader = new ImageLoader(mContext);

        updateViews.setOnClickPendingIntent(R.id.next, next_buildButtonPendingIntent(context));

        updateViews.setOnClickPendingIntent(R.id.back, back_buildButtonPendingIntent(context));

        updateViews.setOnClickPendingIntent(R.id.refresh, refresh_buildButtonPendingIntent(context));

//----These commented as they use context and this also gets null when killed----
        //updateViews.setOnClickPendingIntent(R.id.outer_text_view, merchant_buildButtonPendingIntent(context));

        //updateViews.setOnClickPendingIntent(R.id.check_in, checkin_buildButtonPendingIntent(context));

        //updateViews.setOnClickPendingIntent(R.id.image_logo_id, pIcon_buildButtonPendingIntent(context));

        pushWidgetUpdate(context,updateViews);
    }


//my button listeners: next and prev
//--not shown here---


    public static void pushWidgetUpdate(Context context,RemoteViews views){
        System.out.println("Inside pushwidget");
        context = mContext;

        if(context!=null){
            ComponentName myWidget=new ComponentName(context, StoreWidgetProvider.class);
            AppWidgetManager manager=AppWidgetManager.getInstance(context);
            manager.updateAppWidget(myWidget, views);
        }
        }
    }

    public static class StoreWidgetService extends IntentService implements ServerRequestEnvironment{

        public StoreWidgetService() {
            super("StoreWidgetService");
            // TODO Auto-generated constructor stub
        }

//      protected void onPreExecute(){
//          
//          updateViews.setViewVisibility(R.id.refresh, View.GONE);
//          updateViews.setViewVisibility(R.id.progress, View.VISIBLE);
//          pushWidgetUpdate(mContext,updateViews);
//      }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId){
            super.onStartCommand(intent, flags, startId);
            return START_REDELIVER_INTENT;
        }
        @Override
        public void onHandleIntent(Intent intent) {


            //my data fetching done with all network calls 

        }

//      protected void onPostExecute(Store storeObj) {
//
//          updateViews.setViewVisibility(R.id.progress, View.GONE);
//          updateViews.setViewVisibility(R.id.refresh, View.VISIBLE);
//          
//
//          pushWidgetUpdate(mContext,updateViews);
//      }


        @Override
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }

    }
}   

person Atihska    schedule 21.07.2013    source источник


Ответы (1)


Вы должны зарегистрировать Handler в своем основном потоке пользовательского интерфейса, а затем передать это Handler в IntentService. С помощью этого обработчика вы можете поставить Runnable в очередь на выполнение в потоке пользовательского интерфейса. Поскольку AsyncTask поддерживается ThreadPool, я думаю, что это действительно то, что AsyncTask делает.

Вы также можете попробовать использовать функцию runOnUiThread() (но я думаю, что она может вызываться только объектом Activity).

Взгляните сюда для более глубокого понимания:

http://developer.android.com/training/multiple-threads/communicate-ui.html

person type-a1pha    schedule 21.07.2013
comment
Прочитал и реализовал. Теперь проблема в том, что после завершения службы и если я убью свое приложение, мой виджет перестанет работать и приложение выйдет из строя. Logcat дает мне исключение с нулевым указателем для контекста. Как решить эту проблему? Я хочу, чтобы, если я убью свое приложение, я должен либо получить уже полученные данные, либо просто запустить приложение снова. Как мне сделать это заранее? - person Atihska; 22.07.2013
comment
Найдите здесь START_STICKY, START_REDILIVER_INTENT и другие флаги, которые вы можете вернуть в обратном вызове onStartCommand () запущенной службы. Это режимы, которые позволяют системе обрабатывать за вас перезапуск вашей службы в случае ее остановки. - person type-a1pha; 22.07.2013
comment
Я пробовал их оба, но они снова дают мне исключение нулевого указателя везде, где используется контекст. Я использую IntentService. Я публикую свой код. Пожалуйста, проверьте и направьте .. - person Atihska; 22.07.2013
comment
ТАКЖЕ, после сбоя мои флаги и START_FLAG_REDELIVERY обнуляются. - person Atihska; 22.07.2013