2011-07-13 32 views
5

Tôi gặp lỗi lạ dường như chỉ xảy ra trong Samsung Galaxy S với Android 2.2 (Tôi đã thử nghiệm ứng dụng trong Motorola Milestone 2 Android 2.2/Xperia X10 Android 1.6/Nexus Một Android 2.2/Google G1 Android 1.5 và 1.5 giả lập và trong các thiết bị như vậy lỗi không xảy ra).Android: android.view.InflateException: Dòng tệp nhị phân XML # 13: Lỗi khi lạm dụng lớp <unknown> trong SAMSUNG Galaxy S

hoàn chỉnh stack trace là:

ERROR/AndroidRuntime(28111): FATAL EXCEPTION: AsyncTask #2 
ERROR/AndroidRuntime(28111): java.lang.RuntimeException: An error occured while executing doInBackground() 
ERROR/AndroidRuntime(28111):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
ERROR/AndroidRuntime(28111):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
ERROR/AndroidRuntime(28111):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
ERROR/AndroidRuntime(28111):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
ERROR/AndroidRuntime(28111):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
ERROR/AndroidRuntime(28111):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
ERROR/AndroidRuntime(28111):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
ERROR/AndroidRuntime(28111):  at java.lang.Thread.run(Thread.java:1096) 
ERROR/AndroidRuntime(28111): Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class <unknown> 
ERROR/AndroidRuntime(28111):  at android.view.LayoutInflater.createView(LayoutInflater.java:513) 
ERROR/AndroidRuntime(28111):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
ERROR/AndroidRuntime(28111):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) 
ERROR/AndroidRuntime(28111):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 
ERROR/AndroidRuntime(28111):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:621) 
ERROR/AndroidRuntime(28111):  at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 
ERROR/AndroidRuntime(28111):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
ERROR/AndroidRuntime(28111):  at my.package.MyClass.b(Unknown Source) 
ERROR/AndroidRuntime(28111):  at my.package.MyClass.a(Unknown Source) 
ERROR/AndroidRuntime(28111):  at my.package.MyClass.updateUI(Unknown Source) 
ERROR/AndroidRuntime(28111):  at my.package.MyClass.UpdateUITask.doInBackground(Unknown Source) 
ERROR/AndroidRuntime(28111):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
ERROR/AndroidRuntime(28111):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
ERROR/AndroidRuntime(28111):  ... 4 more 
ERROR/AndroidRuntime(28111): Caused by: java.lang.reflect.InvocationTargetException 
ERROR/AndroidRuntime(28111):  at android.widget.EditText.<init>(EditText.java:101) 
ERROR/AndroidRuntime(28111):  at java.lang.reflect.Constructor.constructNative(Native Method) 
ERROR/AndroidRuntime(28111):  at java.lang.reflect.Constructor.newInstance(Constructor.java:446) 
ERROR/AndroidRuntime(28111):  at android.view.LayoutInflater.createView(LayoutInflater.java:500) 
ERROR/AndroidRuntime(28111):  ... 16 more 
ERROR/AndroidRuntime(28111): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
ERROR/AndroidRuntime(28111):  at android.os.Handler.<init>(Handler.java:121) 
ERROR/AndroidRuntime(28111):  at android.view.GestureDetector$GestureHandler.<init>(GestureDetector.java:250) 
ERROR/AndroidRuntime(28111):  at android.view.GestureDetector.<init>(GestureDetector.java:370) 
ERROR/AndroidRuntime(28111):  at android.view.GestureDetector.<init>(GestureDetector.java:347) 
ERROR/AndroidRuntime(28111):  at android.view.GestureDetector.<init>(GestureDetector.java:331) 
ERROR/AndroidRuntime(28111):  at android.widget.EditText.<init>(EditText.java:113) 
ERROR/AndroidRuntime(28111):  ... 20 more 

Trước hết, những gì đang xảy ra? Lỗi chính là gì? Can't create handler inside thread that has not called Looper.prepare() hoặc android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>?

này dường như xảy ra khi tôi thổi phồng một View mà XML (R.layout.field_editable_label_value_numeric) dòng 13 là:

 <EditText android:id="@+id/editableLabel" 
      android:layout_gravity="left|center_vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="5dp" 
      android:layout_weight="1" 
      android:textColor="@color/black" 
      android:textStyle="bold" /> 

EDIT: Tôi quên nói rằng tôi đang sử dụng Proguard, không biết nếu bằng cách nào đó có ảnh hưởng đến vấn đề này (tôi không nghĩ vậy).

Tôi cũng đã thêm mã nơi tôi nghĩ rằng vấn đề đang xảy ra:

MyClass.a:

final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
final ArrayList<View> views = MyClass.b(inflater); 

runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      LinearLayout mainLayout = (LinearLayout) findViewById(R.id.ItemLinearLayout); 

      //clear UI 
      mainLayout.removeAllViews(); 

      //re-set all views 
      for (View view : views) { 
       mainLayout.addView(view); 
      } 
     } 
} 

MyClass.b:

final ArrayList<View> viewsToAdd = new ArrayList<View>(); 

View view = inflater.inflate(R.layout.field_editable_label_value_numeric, null, true); 
viewsToAdd.add(view); 

return views; 
+0

Đăng mã nơi bạn đang tăng lượt xem – dymmeh

+0

@ dymmeh Tôi chỉ cần chỉnh sửa và thêm mã – pandre

Trả lời

7

Cảm ơn câu trả lời, nhưng lời giải thích tốt nhất mà tôi đã nhận được ở đây: Inflate a view in a background thread

Về cơ bản, có vẻ như Samsung Galaxy S có một thực hiện EditText mà lạm phát chỉ có thể được thực hiện trong UI Chủ đề.

Hy vọng điều này sẽ giúp người nào đó gặp phải vấn đề tương tự.

2

Không cập nhật giao diện người dùng của bạn từ một sợi nền - sử dụng thread UI chỉ.

Dấu vết ngăn xếp giống như lạm phát đang diễn ra theo phương pháp doInBackground của AsyncTask. Đó có thể là dòng này:

final ArrayList<View> views = MyClass.b(inflater); 

Nếu trường hợp đó xảy ra, thì bạn nên di chuyển nó ra khỏi chuỗi nền. Nếu mã bạn đăng thực sự là doInBackground, bạn cũng có thể xem xét di chuyển khối runOnUiThread của mình thành onPostExecute.

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