2013-02-21 2 views
6

나는 안드로이드에 대한 멍청한 놈이야. 그리고 나는 appwidget을 업데이트하는 데 문제가있다. 그것은 20 초마다 다른 텍스트를 표시하는 뉴스 위젯입니다. 위젯이 초기화 될 때 & 디스플레이가 올바르게 표시되도록 텍스트를 가져 오는 데 아무런 문제가 없습니다. 그러나 매 30 분마다 위젯을 업데이트 한 후에 내 widgetID int 배열은 업데이트 이전에 존재 한 int를 유지합니다. 따라서 각 업데이트 후에 위젯은 이전 데이터와 새 데이터를 표시합니다. 업데이트 프로세스 중에 이전 데이터의 위젯 ID int 배열을 삭제할 수 있습니까? 어떤 도움이라도 대단히 감사합니다.AppWidget을 올바르게 업데이트하려면 어떻게해야합니까?

내 코드 : 위젯에 텍스트를 전환

allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 

방법. 이

public void updateStory() { 

    tickerheadline = RssReader.rssheadline.get(storyCounter); 
    tickerstory = RssReader.rssstory.get(storyCounter); 
    remoteViews.setTextViewText(R.id.headline, tickerheadline); 
    remoteViews.setTextViewText(R.id.story, tickerstory); 
    if (storyCounter==RssReader.rssheadline.size()-1){ 
     storyCounter = 0; 
     storyCounter++; 
    }else{ 
     storyCounter++; 
    } 
    appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); 
    //Log.e("Widget", allWidgetIds.toString()); 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      updateStory(); 
     } } ,20000); } 

} 

편집 ... 처음에는 잘 작동하지만 업데이트 후 새로운 데이터와 함께 이전 데이터를 보여줍니다

public void updateStory() { 
    //Added 
    appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext()); 
    ComponentName thisWidget = new ComponentName(getApplicationContext(),MyWidgetProvider.class); 
    remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(),R.layout.widget1);  


    tickerheadline = RssReader.rssheadline.get(storyCounter); 
    tickerstory = RssReader.rssstory.get(storyCounter); 
    remoteViews.setTextViewText(R.id.headline, tickerheadline); 
    remoteViews.setTextViewText(R.id.story, tickerstory); 
    if (storyCounter==RssReader.rssheadline.size()-1){ 
     storyCounter = 0; 
     storyCounter++; 
    }else{ 
     storyCounter++; 
    } 



    appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

    //appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); 
    //Log.e("Widget", allWidgetIds.toString()); 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      updateStory(); 
     } } ,20000); } 

} 
+0

어쩌면 else {storyCounter ++; } to storyConter = 0; 속임수를 쓸 것이다. – k0sh

+0

응답 해 주셔서 감사합니다. 이전 widgetid의 데이터가 어떻게 표시되지 않습니까? –

+0

이전에는 위젯을 사용 해보지 않았지만 비트 맵을 많이 사용합니다. 그리고 내가 특정 비트 맵을 재설정하고 싶다면 bmp = null을 호출 할 것이다; 나는 너가 무엇을하려고하는지 잘 모르겠다. 하지만 당신은 storyCounter ++라고 부릅니다. when storyCounter = 0; 그리고 당신의 성명서에. 즉 당신의 이야기를 지웠다는 것을 의미합니다. 카운터 = 0; 그리고 당신은 storyCounter ++라고 불렀습니다. 왜 그럴거야? 논리적으로 당신이 다른 진술에 당신은 다른 일을해야하지만 당신의 경우에는 똑같은 일을 두 번하고 있습니다. – k0sh

답변

1

당신은 업데이트 등의 측면에서 안드로이드에 AppWidgets 매우 영리 수 있지만 가장 쉬운 방법은 새로 고침 할 때마다 위젯 내용을 다시 작성하는 것입니다. 30 분마다 새로 고침을하기 때문에 CPU 사용에 대해 걱정할 필요는별로 없습니다.

표준 접근법을 사용하여 업데이트를 트리거 할 때마다 표준 재구성을 제안합니다. 위의 코드는 올바르게 보이지만 실제로 강제로 업데이트하지는 않습니다. 처음부터 새로 시작하는 것이 훨씬 깔끔합니다. 그것이 작동하면, 당신이 그것을 더 가볍게 만들 수 있다면, 어떻게 말해? 종종

// You need to provide: 
// myContext - the Context it is being run in. 
// R.layout.widget - the xml layout of the widget 
// All the content to put in it (duh!) 
// Widget.class - the class for the widget 

RemoteViews rv= new RemoteViews(myContext.getPackageName(), R.layout.widget); 
rv.setXXXXXXX // as per normal using most recent data set. 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(myContext); 
// If you know the App Widget Id use this: 
appWidgetManager.updateAppWidget(appWidgetId, rv); 
// Or to update all your widgets with the same contents: 
ComponentName projectWidget = new ComponentName(myContext, Widget.class); 
appWidgetManager.updateAppWidget(projectWidget, rv); 

(내보기에) 가장 쉬운 방법은 당신이 서비스에서 전화를하거나 직접 시간 알람 호출을 사용 중 하나 WidgetUpdater.class이를 마무리하는 것입니다. onUpdate를 사용하면 일반적으로 휴대 전화가 최대 전력 모드로 전환되고 제어하기가 어렵 기 때문에 나쁜 생각입니다. 나는 그 일을 가능하게 만들지 못했습니다.

Intent myIntent = // As per your onUpdate Code 
    alarmPendingIntent = PendingIntent.getService(context, 0, myIntent, PendingIntent.FLAG_ONE_SHOT); 

    // ... using the alarm manager mechanism. 
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, nextUpdateTimeMillis, alarmPendingIntent); 
+0

제안 해 주셔서 감사합니다. 내 위젯 공급자 클래스의 onUpdate 메서드에서 이미 내 위젯을 업데이트합니다. 제 편집을 확인하고 올바르게 처리했는지 확인하십시오. –

+0

나는 다른 접근법을 제안하는 이유를 분명히하기 위해 답을 넓혔습니다. 여전히 명확하지 않다면 말하십시오. –

+0

지금 분류 해 주시겠습니까? –

관련 문제