针对窗口小部件的服务内部的网络调用

时间:2013-10-23 09:33:16

标签: android service android-asynctask

我有一个与Android Widget相关的问题(主屏幕上的那些) 我正在尝试创建一个小部件,它会定期更新其内容。

我使用一个叫做的服务。 当我尝试在此服务中进行基本网络调用(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;
}

}

谢谢大家的观点!

1 个答案:

答案 0 :(得分:0)

不是在您的服务中使用AsyncTask,而是扩展IntentService,而不是更简单。

此外,拥有某种缓存机制会更好。首先更新缓存,然后使用缓存中的数据更新窗口小部件。这样,您的小部件将完全自治。您可以使用内容提供商。

还有一点需要注意。使用简单的服务时,不要忘记停止它。在您的情况下,您必须在stopSelf中致电onPostExecute。您不必明确停止IntentService