2013-07-21 56 views
0

我有一個android應用程序小部件,其中我使用了網絡調用的異步任務。如果我想將我的呼叫從asynctask轉移到intent服務。 doInBackground()的工作可以在onHandleIntent()中完成,但onPreExecute()和onPostExecute()如何。在這兩種方法中,我有進度條代碼,爲我的刷新按鈕提供旋轉效果。 我應該在意向服務中把這個代碼放在哪裏?從asynctask到意圖服務的映射

UPDATE

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

    } 
} 

回答

0

您的主UI線程註冊一個Handler,那麼你通過這個HandlerIntentService。通過這個處理程序,你可以排隊Runnables在UI線程上執行。由於AsyncTaskThreadPool支持,我認爲這是AsyncTask確實在做的事情。

你也可以嘗試使用函數runOnUiThread()(但我認爲它只能被一個Activity對象調用)。

看看這裏的更深層次的理解:

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

+0

我讀到它並實施。現在的問題是,一旦服務完成,如果我殺了我的應用程序,我的小部件停止工作,應用程序崩潰。 logcat給我上下文的空指針異常。如何解決這個問題?我希望如果我殺了我的應用程序,我應該獲取已獲取的數據或者再次啓動應用程序。我應該怎麼做呢? – Atihska

+0

在此處搜索START_STICKY,START_REDILIVER_INTENT和其他可以在已啓動服務的onStartCommand()回調中返回的標誌。這些模式可讓系統爲您處理重啓服務以防萬一死機。 –

+0

我嘗試了這兩種方法,但無論使用上下文,他們都會再次給我空指針異常。我正在使用IntentService。我張貼我的代碼。請檢查並指導.. – Atihska