实现 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 Widget 更新更快

渲染问题:Android Studio 1.1.0 中 android.support.v7.widget.RecyclerView 的 java.lang.NullPointerException

android studio 怎么实现按钮跳转

我们如何在 android studio 中使用 v7widget 代码?如何在 androidx 中使用 v7widget?

Android studio 3.6 ToolBar问题