2013-10-23 62 views
0

我有一個與Android小部件(主屏幕上的那些)有關的問題 我試圖創建一個小部件,它將定期更新其內容。小部件的服務內部網絡調用

我使用一個被調用來執行該操作的服務。 當我嘗試在這個服務中進行基本的網絡調用(GET)時,我遇到了NetworkOnMainThread異常。

我知道這個例外是什麼,但我認爲在Android的服務是在一個單獨的線程。所以我只是錯了...

所以,爲了做到這一點,我做了一個AsyncTask,但我不滿意我的代碼,我只是認爲我所做的不是一個好用法。 打電話給任何人告訴我,如果我的想法是正確的?

這裏是我的服務內容:

public class ServiceUpdate extends Service 
{ 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    new AsyncTask<Void, Void, Void>() 
    { 
     String res = null; 

     @Override 
     protected Void doInBackground(Void... params) 
     { 
      // Getting something from the WWW 
      res = Network.getStringFromWS("http://wordpress.org/plugins/about/readme.txt"); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) 
     { 
      // Substring for test 
      res = res.substring(0, 100); 

      RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), 
        R.layout.widget_layout); 
      remoteViews.setTextViewText(R.id.tvTime, res); 

      ComponentName thiswidget = new ComponentName(getApplicationContext(), TimeWidgetProvider.class); 
      AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext()); 
      manager.updateAppWidget(thiswidget, remoteViews); 

      super.onPostExecute(result); 
     } 
    }.execute(); 

    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public IBinder onBind(Intent arg0) 
{ 
    return null; 
} 

}

謝謝大家對你的觀點!

回答

0

而不是在您的服務中使用AsyncTask,延長IntentService,它更簡單。

此外,有一些緩存機制會更好。首先更新緩存,然後使用緩存中的數據更新Widget。這樣你的小部件將完全自治。您可能會使用內容提供商。

還有一點需要注意。使用簡單的服務時,不要忘記停止它。在你的情況下,你必須撥打stopSelfonPostExecute。您不必明確停止IntentService