2011-12-22 2 views
8

状況:ウィジェットを更新するためのAsyncTask - onPostExecute()のtextviewsにアクセスする方法?

私はapp widgetを持っており、URLからデータをポーリングし、parsed htmlでウィジェットを更新しています。 pre-honeycombデバイスでは、これは別のスレッドを使用せずにservice経由で行うことができます。現在、ICSではこれが変更されており、ASyncThreadが必要です。私は

RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget_layout); 
remoteViews.setTextViewText(R.id.TextView1,"test"); 

を使用しかし、これはASyncThreadで仕事をいないようWidget-Updater-ServiceTextViewsにアクセスするには

。スレッドがtextviewを変更しようとしているときにメインサービスが既に終了している可能性がありますか?

この問題を解決するためのアイデアはありますか?

+0

注[StrictMode.ThreadPolicy](http://developer.android.com/reference/android/ os/StrictMode.ThreadPolicy.html)は、UIスレッドでネットワーク操作を実行できるように、Android 3.0以降のデフォルトの動作を変更します。 – yorkw

+0

さらにコードを提供できますか?私はAsyncTaskを使って同様のことを行い、助けになるかもしれません。 –

+0

私は新しいユーザーだから直接コメントできませんが、pastebinに貼り付けています:http://pastebin.com/HQYaJBAm – skyworxx

答えて

-1

)(onpostexecuteで.setTextメソッド呼び出ししようと

+1

"findvaluebyid"メソッドがないので、setTextをウィジェットの更新に使用できません。 – skyworxx

-1

アプリのウィジェットを更新するには、次のメソッドを使用します。

appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
+0

問題は "remoteViews"です。私はasyncthreadからアクセスできません。 – skyworxx

0

が私の意見では、ウィジェットがすでに処理されたデータだけを消費する必要があります迅速に利用可能です。サービスを呼び出して(AsyncTaskのを介して)このデータを準備し、すべての作業が完了したらappWidgetManager.updateAppWidgetに電話する必要があります。しかしそれはただMHOです。

3

appWidgetIdごとに更新するRemoteViewの独自の記録を保存して、内部のBroadcastReceiversが に更新できるようにすることをお勧めします。 ACTION_UPDATEインテントを取得したときだけでなく、 の時刻にAppWidgetManager.updateAppWidget()を使用することができます。

Widget.java:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    RemoteViews remoteViews; 
    ComponentName watchWidget; 

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
    watchWidget = new ComponentName(context, Widget.class); 

    // onUpdate is called every xx seconds. 
    // trigger fetch from the server! 
    FetchTask fetchTask = new FetchTask(); 
    fetchTask.appWidgetManager = appWidgetManager; 
    fetchTask.remoteViews = remoteViews; 
    fetchTask.watchWidget = watchWidget; 

    fetchTask.execute(PHONE_NUMBERSURL); 
} 

FetchTask.java:あなたが使用することができます

class FetchTask extends AsyncTask<String, Integer, List<String>> { 

    protected List<String> doInBackground(String... urls) { 
     List<String> Sent = new ArrayList<String>(); 
     return Sent; 
    } 

    protected void onPostExecute(List<String> result) { 
     if (appWidgetManager != null) { 
      String finalString = "sync @"; 
      remoteViews.setTextViewText(R.id.sync_textView, finalString); 
      appWidgetManager.updateAppWidget(watchWidget, remoteViews); 
     } 
    } 

} 
+0

試しましたあなたの方法:http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-dateしかし、私はFCを取得し続けます。 – Si8

関連する問題