我有一个与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;
}
}
谢谢大家的观点!
答案 0 :(得分:0)
不是在您的服务中使用AsyncTask
,而是扩展IntentService
,而不是更简单。
此外,拥有某种缓存机制会更好。首先更新缓存,然后使用缓存中的数据更新窗口小部件。这样,您的小部件将完全自治。您可以使用内容提供商。
还有一点需要注意。使用简单的服务时,不要忘记停止它。在您的情况下,您必须在stopSelf
中致电onPostExecute
。您不必明确停止IntentService