2011-12-22 33 views
8

Tình huống sau:AsyncTask để cập nhật tiện ích - cách truy cập vào các bản xem trước văn bản trong onPostExecute()?

Tôi có số app widget để thăm dò dữ liệu từ url và cập nhật tiện ích con với parsed html. Trên pre-honeycomb thiết bị, điều này có thể được thực hiện thông qua service mà không cần sử dụng một chuỗi riêng biệt. Bây giờ, trên ICS, điều này đã thay đổi và cần ASyncThread.

Để truy cập vào TextViews trong Widget-Updater-Service tôi sử dụng

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

Nhưng điều này dường như không làm việc trong một ASyncThread. Có thể nào, dịch vụ chính đã bị chấm dứt khi luồng đang cố thay đổi textview?

Bất kỳ ý tưởng nào về việc giải quyết vấn đề này?

+0

Lưu ý rằng bạn có thể sử dụng [StrictMode.ThreadPolicy] (http://developer.android.com/reference/android/ os/StrictMode.ThreadPolicy.html) thay đổi hành vi mặc định trên Android 3.0+, để tiếp tục cho phép hoạt động mạng chạy trên chuỗi giao diện người dùng. – yorkw

+0

bạn có thể cung cấp thêm một số mã không? Tôi đang sử dụng một AsyncTask để làm một cái gì đó tương tự và có thể giúp đỡ. –

+0

Tôi không thể nhận xét trực tiếp vì tôi là người dùng mới, nhưng tôi đã đặt nó lên pastebin: http://pastebin.com/HQYaJBAm – skyworxx

Trả lời

-1

Đang cố gắng gọi phương thức .setText trong onpostexecute()

+1

không có "findvaluebyid" -method, vì vậy tôi không thể sử dụng setText để cập nhật tiện ích – skyworxx

-1

Sử dụng phương pháp sau đây để cập nhật phụ tùng ứng dụng của bạn:

appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
+0

Vấn đề là "remoteViews", tôi không thể truy cập nó từ một asyncthread – skyworxx

0

Theo tôi, các phụ tùng phải được tiêu thụ chỉ dữ liệu mà đã được xử lý và có sẵn ngay lập tức. Có lẽ bạn nên gọi một dịch vụ để chuẩn bị dữ liệu này (thông qua AsyncTask) và khi tất cả công việc được thực hiện, dịch vụ nên gọi appWidgetManager.updateAppWidget. Nhưng đó chỉ là MHO.

3

Cách tốt nhất để giữ bản ghi của riêng bạn của Chế độ xem từ xa được cập nhật cho mỗi appWidgetId để BroadcastReceivers riêng tư của bạn có thể cập nhật nó. Bạn có thể sử dụng AppWidgetManager.updateAppWidget() tại bất kỳ thời điểm nào không chỉ khi bạn nhận được ý định ACTION_UPDATE.

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

Tôi đã thử phương pháp của bạn cho việc này: http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-date nhưng tôi tiếp tục nhận được một FC. – Si8

Các vấn đề liên quan