2009-07-21 12 views
29

orijinal etkinliğin görüşlerini erişmek için. Ben TextView'un ortak bir statik alan yapım denedimnasıl bir etkinlik A denir ve menü öğesi 0 seçimi üzerine, yeni bir iş parçacığı bir çalıştırılabilir C başlatır hizmet B olarak çoğaltılır sahip olurken arka plan hizmeti

iplik C. erişmek istediğiniz etkinlik A'da bir TextView, var, ama bu şu hatayı oluşturur:

07-21 07:26:25.723: ERROR/AndroidRuntime(1975): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.view.ViewRoot.checkThread(ViewRoot.java:2440) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.view.ViewRoot.invalidateChild(ViewRoot.java:522) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:540) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:2332) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.view.View.invalidate(View.java:4437) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.widget.TextView.updateAfterEdit(TextView.java:4593) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.widget.TextView.handleTextChanged(TextView.java:5932) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6081) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:352) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:259) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:28) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.widget.TextView.append(TextView.java:2191) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at android.widget.TextView.append(TextView.java:2178) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at com.android.peekaboo.DoScan$scanBody.run(DoScan.java:36) 
07-21 07:26:25.723: ERROR/AndroidRuntime(1975):  at java.lang.Thread.run(Thread.java:1058) 

Ben de var Görünüm'ü bir niyetle geçirmeyi denediğini düşündüm, ancak bunun nasıl olacağını bilmiyorum. Bu işi yapmak için neye ihtiyacım var?

cevap

21

Sen GUI iplikten widget'lar, nam 'görünüm hiyerarşisi yarattığı iplik' güncellemeniz gerekir. Bunu yapmanın standart yolu Handler s'dir ve işleyicilerin nasıl kullanılacağına ilişkin bir örnek ProgressDialog Example ('ProgressDialog öğesini ikinci bir iş parçacığıyla') genişletebilir.

1

başka yolu işleme os.android.AsyncTaskyararlanmaktır.

2

Doğrudan bir hizmetten widget'ları değiştirmek istemiyorsunuz.

Örneğin

, kullanıcı onu G1 klavyeyi dışarı kayar varsayalım. Etkinliğin yok edildi ve yeniden yaratıldı. Bununla birlikte, hizmetiniz artık geçersiz olan bir etkinlikten widget'ları tutuyor. En iyisi, güncellemeler oluşmayacak. En kötüsü, güncellemeler bir çökmeye neden olacak veya uygulamanız hafızayı sızdırıyor çünkü eski etkinlik çöp toplanamıyor çünkü hizmetiniz yine de ona ait.

Having hizmetleri faaliyetleri çok uzun aralarında iyi izolasyon ve yok edilir, etkinlik hizmetinden ayrılıyor olarak, Tamam bildirir.

25

Bir ListView ayrı bir iş parçacığı gelen web hizmeti yanıtına güncellenmesi gerekli benzer bir sorunu yaşıyordu.

bir similar question & example analiz ettikten sonra, burada sizin için çalışmalı bir çözümdür:

public class A extends Activity implements Callback { 

    callserviceB() { } // where your service B being called; 

    @Override 
    public void returnServiceResponse() { 
      workOnResponse(); 
      handler.sendEmptyMessage(0); 
    } 

    private Handler handler = new Handler() { 
      public void handleMessage(Message msg) { 
       //update your view from here only. 
      } 
    } 
} 

public class B implements Runnable { 
    Callback callback; 

    public void run() { 
     //your business logic. 
     callback.returnServiceResponse(); 
    } 
} 

public interface Callback { 
    public void returnServiceResponse(); 
} 
+2

Kod örnekleri her zaman çok çok daha yararlı açıklamaları daha vardır. Teşekkürler :) – HXCaine

+0

Teşekkürler, bu sorun beni uzun zamandır takip ediyor! Teşekkür ederim! – Daniel