0

ネットワーク呼び出しに非同期タスクを使用した Android アプリ ウィジェットがあります。ここで、呼び出しを asynctask からインテント サービスに移行したいと考えています。doInBackground() の作業は onHandleIntent() で実行できますが、onPreExecute() と onPostExecute() はどうでしょうか。これら 2 つのメソッドにプログレス バー コードがあり、更新ボタンに回転効果を与えます。このコードをインテント サービスのどこに配置すればよいですか?

アップデート

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;
        }

    }
}   
4

1 に答える 1

0

Handlerをメインの UI スレッドに登録してから、これHandlerを に渡す必要がありIntentServiceます。このハンドラーを介しRunnableて、UI スレッドで実行するために s をキューに入れることができます。AsyncTaskに裏打ちされているので、これが実際にやっているThreadPoolことだと思います。AsyncTask

関数を使用することもできますrunOnUiThread()(ただし、オブジェクトからのみ呼び出すことができると思いActivityます)。

より深い理解のためにここを見てください:

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

于 2013-07-21T19:46:43.440 に答える