我的小部件在一段时间后停止更新/工作。我有一个简单的小部件,每隔几个小时显示一次引号(现在设置为测试的秒数),对于定时它使用一个单独的线程。
有什么不对?为什么它会停止更新? 谢谢!
package com.example.napiige;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.Button;
import android.widget.RemoteViews;
public class MainActivity extends AppWidgetProvider {
String azIge;
static MainActivity[] ige = new MainActivity[3];
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
String ig1 = context.getString(R.string.ige1);
String ig2 = context.getString(R.string.ige2);
String ig3 = context.getString(R.string.ige3);
ige = new MainActivity[3];
ige[0] = new MainActivity();
ige[1] = new MainActivity();
ige[2] = new MainActivity();
ige[0].azIge = ig1;
ige[1].azIge = ig2;
ige[2].azIge = ig3;
go(context, appWidgetManager, appWidgetIds);
}
}
void go(final Context context, AppWidgetManager mgr, final int[] myWidgetId) {
final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget);
new Thread(new Runnable() {
public void run() {
int i = 0;
while (i < 3) {
try {
Thread.sleep(3000);
views.setTextViewText(R.id.igePrint, ige[i].azIge);
AppWidgetManager awManager = AppWidgetManager.getInstance(context);
awManager.updateAppWidget(myWidgetId, views);
} catch (InterruptedException e) {
e.printStackTrace();
}
i = i + 1;
if (i == 3) {
i = 0;
}
}
}
}).start();
}
}
答案 0 :(得分:1)
如果您每隔几个小时更新一次,为什么不使用内置功能来更新AppWidgetProviderInfo中的应用程序小部件,请使用android:updatePeriodMillis
设置更新时间(此时可以获得的最短时间为30分钟我相信,但它应该适合你)。有关详细信息,请访问http://developer.android.com/guide/topics/appwidgets/index.html?utm_source=Android+Weekly&utm_campaign=b32a249c8f-Android_Weekly_46&utm_medium=email
我相信系统会在感觉到这种情况时杀死你的线程,它没有义务继续运行。
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen|keyguard"
android:initialKeyguardLayout="@layout/example_keyguard">
</appwidget-provider>
答案 1 :(得分:1)
如果设备在需要更新时处于睡眠状态,则设备将被唤醒以执行更新。即使您在android:updatePeriodMillis
中呼叫减少30分钟,它也会出现测试目的t更新,因为它需要最多30英里的时间更新。我们也可以通过调用reiever并检查receiever
中的操作并手动调用更新方法手动更新它,因为onUpdate()
metod将不会调用android