实现 Widget Android Studio 的问题 - AsyncTask
Posted
技术标签:
【中文标题】实现 Widget Android Studio 的问题 - AsyncTask【英文标题】:Problems Implmenting Widget Android Studio - AsynTask 【发布时间】:2020-10-27 06:21:23 【问题描述】:我是 android Studio 的新手。在我的 MainActivity.java 中,我调用了 ReadPage 类,该类从 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)
。
我不知道如何实现这个小部件,并且我所做的所有问题都完成了强制关闭应用程序。
编辑:
根据创建小部件的基本示例,我定义了这样的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
才会更新,尽管我已将 android:updatePeriodMillis="3000"
定义到我的 app_widget_info.xml
中
我的app_widget.xml
是这样定义的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>
<TextView
android:layout_
android:layout_
android:layout_margin="10dp"
android:text="Field"
android:id="@+id/FieldJSON"
android:textSize="12sp"
/>
<Button
android:layout_
android:layout_
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.java 的button
BUpdatingDate 和 UpdateDate 函数中添加了onclick
函数:
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);
【问题讨论】:
所以你想创建一个将由 json 更新的小部件?你实现了它并与我们分享吗? 我已经添加了一些实现的规范基础,谢谢 最后一件事,onUpdate 在您的活动或片段中位于何处? 它在我的 AppWidget 类中(已编辑) 【参考方案1】:我认为这里发生的事情是因为没有在正确的地方调用 onUpdate 乐趣:
要更新 UI,您应该将所有与 UI 相关的更新放在 AsyncTask 的 onPostExecute() 中
调用api和获取JSON在AsyncTask的doInBackGround()中
【讨论】:
我已经编辑了我的问题(我添加了调用 onUpdate 函数的部分);但我不知道如何传递所需的参数 在单击时,您应该将带有更新功能的 AsyncTask 放在 onPostExecute() 中,因此当 doInBackground 完成时,更新功能将在 onPostExecute 中调用,您将在 View 上看到结果 我的 doInBackground、onProgressUpdate 和 onPostExecute 函数与 ReadPage 类中的函数相同。我用 onUpdate 函数的新调用更新了问题中的 UpdateDate 函数,但它仍然不起作用 尽管有你的帮助,我还是做不到以上是关于实现 Widget Android Studio 的问题 - AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章
android.support.v4.widget.DrawerLayout 不在 Android Studio 中呈现
渲染问题:Android Studio 1.1.0 中 android.support.v7.widget.RecyclerView 的 java.lang.NullPointerException
我们如何在 android studio 中使用 v7widget 代码?如何在 androidx 中使用 v7widget?