我是Android Studio的新编程。在我的MainActivity 中.java我调用 ReadPage 类,该类从 AsyncTask 扩展到 AsyncTask(可以读取 JSON 格式的网页(,其中我覆盖了doInBackground、onProgressUpdate 和 onPostExecute;直到这里,该应用程序运行良好。
但是,我想实现一个小部件AppWidget.java以便可以读取JSON格式的同一页面并在小部件字段中打印给定的信息。由于 ReadPage 类被定义为MainActivity.java,我编写了一个几乎相同的函数的ReadPageWidget函数,但我无法实现它并让它工作:
在AppWidget.java中,我知道在我的onUpdate函数中,我必须调用new ReadPageWidget(views).execute("Updating")
然后appWidgetManager.updateAppWidget(appWidgetId, views);
以前定义视图的位置,就像RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.app_widget);
在我的小部件中,我想要一个按钮,按下该按钮会更新网页中的信息,所以我定义了一个function public void UpdateDate(View view)
。
我不知道如何实现这个小部件,并且,我所做的所有proobs都完成了强制关闭应用程序。
编辑: 根据创建小部件的基本示例,我定义了如下onUpdate
函数:
public class AppWidget extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.app_widget);
SimpleDateFormat Date = new SimpleDateFormat("HH:mm:ss aa");
String DateFormat = Date.format(Calendar.getInstance().getTime());
views.setTextViewText(R.id.TVUpdatingDate, DateFormat);
new ReadPageWidget(views).execute("Updating");
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
...
}
在此,我创建了 ReadPageWidget 的实例并使用参数views
执行 AsynTask。只有当我运行应用程序时,字段DateFormat
才会更新,尽管我已经在我的app_widget_info.xml
中定义了android:updatePeriodMillis="3000"
我的app_widget.xml
定义如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="Field"
android:id="@+id/FieldJSON"
android:textSize="12sp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="UpdatingDate"
android:id="@+id/BUpdatingDate"
android:onClick="UpdateDate"
android:textSize="12sp"
/>
</RelativeLayout>
其中FieldJSON
应由小部件使用ReadPageWidget
函数进行更新。
ReadPage 和ReadPageWidget 之间的唯一区别在于属性的定义和构造函数方法:
public class ReadPage extends AsyncTask<String, Integer, String> {
MainActivity Context;
ProgressBar ProgressBarReadPage;
TextView TVPage;
public ReadPage(MainActivity Context) {
this.Context = Context;
}
...
}
与
public class ReadPageWidget extends AsyncTask<String, Integer, String> {
private RemoteViews views;
public ReadPageWidget(RemoteViews views) {
this.views = views;
}
}
编辑:
我在 AppWidget 的button
BUpdatingDate 和 UpdateDate 函数中添加了onclick
函数.java:
public void UpdateDate(View view) {
Toast.makeText(view.getContext(), "Clicked!!", Toast.LENGTH_SHORT).show();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(view.getContext());
ComponentName thisAppWidgetComponentName = new ComponentName(view.getContext().getPackageName(), getClass().getName());
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidgetComponentName);
this.onUpdate(view.getContext(), appWidgetManager, appWidgetIds);
}
我认为这里发生的事情是因为没有在正确的地方调用onUpdate乐趣:
要更新 UI,您应该将所有与 UI 相关的更新放在 AsyncTask 的 PostExecute(( 中
调用 API 和获取 JSON 在 AsyncTask 的 doInBackGround(( 中