我有带有2个按钮的小部件按钮,带有id刷新,第二个按钮带有id detailsInfo。第一个按钮应该触发小部件更新,第二个按钮显示详细信息(在小部件刷新后下载)。 这是天气小部件。刷新应触发下载全天候数据。基本天气信息应直接显示在窗口小部件上,详细活动的完整数据,在detailsInfo按钮上单击启动。
这是我的代码:
public class AppWidget extends AppWidgetProvider
{
public static String ACTION_DETAILS = "m.m.meteowidget.ACTION_DETAILS";
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("onReceive",intent.getAction());
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context ctxt, AppWidgetManager mgr, int[] appWidgetIds)
{
ComponentName me = new ComponentName(ctxt, AppWidget.class);
final RemoteViews updateViews = new RemoteViews(ctxt.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(ctxt, AppWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
updateViews.setOnClickPendingIntent(R.id.refresh, pi);
Intent intent2 = new Intent(ctxt, DetailsActivity.class);
intent2.setAction(ACTION_DETAILS);
PendingIntent di = PendingIntent.getActivity(ctxt, 0, intent2, 0);
updateViews.setOnClickPendingIntent(R.id.detailsInfo, di);
mgr.updateAppWidget(me, updateViews);
for (int i = 0; i < appWidgetIds.length; i++)
new WeatherInfo(updateViews,appWidgetIds[i],mgr).execute();
}
}
WeatherInfo是实际执行天气详细信息下载的类(它扩展了AsyncTask)。如您所见,它将我的updateViews作为构造函数参数,然后设置我的小部件上显示的基本天气信息。
但是,我不知道如何显示详细的信息活动并将详细的天气信息传递给它。当我尝试如上所示运行我的活动时,我的窗口小部件无法加载(&#34;问题加载窗口小部件&#34;),没有任何我可以调试的例外。
任何想法我做错了什么?
[编辑] 这似乎(差不多)好了:
窗口小部件提供程序:
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("onReceive",intent.getAction());
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context ctxt, AppWidgetManager mgr, int[] appWidgetIds)
{
ComponentName me = new ComponentName(ctxt, AppWidget.class);
final RemoteViews updateViews = new RemoteViews(ctxt.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(ctxt, AppWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
updateViews.setOnClickPendingIntent(R.id.refresh, pi);
mgr.updateAppWidget(me, updateViews);
Intent intent2 = new Intent(ctxt, DetailsActivity.class);
intent2.setAction(ACTION_DETAILS);
PendingIntent di = PendingIntent.getActivity(ctxt, 0, intent2, 0);
updateViews.setOnClickPendingIntent(R.id.detailsInfo, di);
mgr.updateAppWidget(me, updateViews);
for (int i = 0; i < appWidgetIds.length; i++)
new WeatherInfo(updateViews,appWidgetIds[i],mgr).execute();
}
我的异步任务:
public class WeatherInfo extends AsyncTask<String, Void, Map>
{
private RemoteViews views;
private int WidgetID;
private AppWidgetManager WidgetManager;
private DetailsActivity detailsActivity;
public WeatherInfo(RemoteViews views, int appWidgetID, AppWidgetManager appWidgetManager)
{
this.views = views;
this.WidgetID = appWidgetID;
this.WidgetManager = appWidgetManager;
}
@Override
protected Map doInBackground(String... strings)
{
Document doc = null;
try
{
doc = Jsoup.connect("http://meteo.uwb.edu.pl/").get();
}
catch (IOException e)
{
Log.e("","Connection failed: " + e.getMessage());
return null;
}
Elements tables = doc.select("td");
Elements headers = tables.get(2).select("b");
Elements vals = tables.get(3).select("b");
Map all = new LinkedHashMap();
for (int i=0;i<headers.size() ; i++)
all.put(headers.get(i).text(),vals.get(i).text());
Global.weatherInfo = all;
return all;
}
@Override
protected void onPostExecute(Map map)
{
if(map==null) return;
String txt = "";
String temp = (String) map.values().toArray()[0];
String hum = (String) map.values().toArray()[1];
String pressure = (String) map.values().toArray()[2];
String temp2 = "Odczuwalna: " + map.values().toArray()[3];
views.setTextViewText(R.id.info_temp, temp);
views.setTextViewText(R.id.info_temp2, temp2);
views.setTextViewText(R.id.info_hum, hum);
views.setTextViewText(R.id.info_pressure, pressure);
WidgetManager.updateAppWidget(WidgetID, views);
}
}
所以我有一个带有weatherInfo静态字段的Global类来分享我的线程和细节活动之间的值。
然而,有两件事我不知道如何解决: - 如果活动被销毁(从Android上的最后一个应用列表中删除),在我按下我的小部件上的详细信息按钮后,活动为空(因此Global.weather信息为空)。我需要再次触发小部件刷新然后启动我的活动 - 如果我尝试在PostExecute方法中设置Global.weatherInfo我的小部件无法显示,没有任何异常抛出 - 为什么? - 我还试图在创建我的活动时触发我的异步任务。所以我创建了第二个WeatherInfo构造函数并将DetailSActivity对象传递给它,以便能够刷新我的活动。即使我不使用第二个构造函数,我的小部件也无法正常加载。
我很困惑,有人能告诉我这里发生了什么吗?以及如何解决我的问题?
答案 0 :(得分:0)
单独创建AsyncTask。从postexecute()方法返回值。处理程序将为您提供更好的解决方案来处理asynktask的响应。 在填充UI组件中的值之前调用此asynctask。无论你想要什么,都可以通过对话框单独处理错误案例。 follow the link for clearance in handler
答案 1 :(得分:0)
我通过在sqlite数据库中存储数据使其工作。因此,在小部件刷新后,所有数据都将保存到数据库中。数据库也用于数据缓存,因此如果没有Internet连接,则widget会释放缓存的数据。将加载相同的缓存数据以显示在我的活动中。