gpt4 book ai didi

android - 在 Handler 和 Thread Widget 中设置 TextView

转载 作者:行者123 更新时间:2023-11-30 03:45:46 25 4
gpt4 key购买 nike

如何在处理程序中设置 TextView?

public class DigitalClock extends AppWidgetProvider {

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
int N = appWidgetIds.length;

RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.digitalclock);

for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];

Intent clockIntent = new Intent(context, DeskClock.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
clockIntent, 0);

views.setOnClickPendingIntent(R.id.rl, pendingIntent);

appWidgetManager.updateAppWidget(appWidgetId, views);
}
}

private static Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// update your textview here.


}
};

class TickThread extends Thread {
private boolean mRun;

@Override
public void run() {
mRun = true;

while (mRun) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mHandler.sendEmptyMessage(0);
}
}
}

我应该在这里更新 TextView:

    private static Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// update your textview here.
...

我该怎么做?在 OnUpdate 方法中,我会使用 views.setTextViewText(R.id... 但在 Handler 中 RemoteViews 不存在。我已经尝试了所有方法知道,到目前为止,什么都没有

最佳答案

创建一个新的 :) RemoteViews 只是附加到远程实体,您几乎可以排队它在实现时所做的一系列更改。

所以当你这样做的时候

appWidgetManager.updateAppWidget(appWidgetId, views);

那是 RemoteView 真正做某事的时候。

我认为真正的问题是所使用的设计有点乱。所以你有一个线程,不确定它从哪里开始,但它调用了一个处理程序,这很好,但你可能应该发送一些结构化数据,以便处理程序知道该做什么。 RemoteViews 实例本身是可打包的,这意味着它们可以作为 Intent 和 Message 实例等内容的有效负载的一部分发送。这种设计的真正问题在于,您无法在没有 AppWidgetManager 实例的情况下调用 updateAppWidget 来实际执行您的更改。

您可以在小部件的生命周期内缓存 AppWidgetManager,或者更新更新频率并移至更多的延迟队列 worker 。您从系统收到的下一次更新事件的位置,或两者的混合。

private SparseArray<RemoteView> mViews;

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {

....
for (int appWidgetId : appWidgetIds) {
RemoteViews v = mViews.get(appWidgetId);
if (v != null) {
appWidgetManager.updateWidget(appWidgetId, v);
} else {
enqueue(appWidgetManager, appWidgetId, new RemoteViews(new RemoteViews(context.getPackageName(),
R.layout.digitalclock)));
/* Enqueue would pretty much associate these pieces of info together
and update their contents on your terms. What you want to do is up
to you. Everytime this update is called though, it will attempt to update
the widget with the info you cached inside the remote view.
*/
}
}
}

关于android - 在 Handler 和 Thread Widget 中设置 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com