android:无法在doInBackground中未调用Looper.prepare()的线程内创建处理程序

时间:2013-04-04 13:08:03

标签: android android-asynctask runtime-error

我想在EditText中添加ClickableSpanAsynkTask个。

我使用了下一个代码:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        et = (EditText)findViewById(R.id.et);
        ...

        class makeLinksAsync extends AsyncTask<String, String, EditText> {

            private EditText buffer;

            protected EditText doInBackground(String... texts) {
            buffer = new EditText(context); // here is an error
                SpannableString spanStr = new SpannableString("word");
                ...
                buffer.append(spanStr);

                return buffer;
           }

           protected void onPostExecute(EditText linkedText) {
           ed.setText(linkedText.getText());
           }
     }
}

当我使用Android2.3在不同的模拟器和我自己的设备上测试此代码时,一切都很好,这段代码运行良好。但是在将apk上传到GooglePlay后,我获得了一些崩溃报告,其中包含上述行中的错误。 日志报告是下一个:

java.lang.RuntimeException: An error occured while executing doInBackground()
...
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
...
at lubart.apps.dictionary.DictionaryActivity$makeLinksAsync.doInBackground(DictionaryActivity.java:2233) // this line is mentioned in code

另外我应该说,这个问题并非出现在所有设备中,有些用户报告说一切正常。

你能帮我解决这个错误吗?

2 个答案:

答案 0 :(得分:2)

您不应在后台线程中操纵UI组件(例如EditText)。

请确保您不与EditText方法中的任何doInBackground互动。

答案 1 :(得分:1)

这是我的答案:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    et = (EditText)findViewById(R.id.et);
    ...

    class makeLinksAsync extends AsyncTask<String, String, SpannableStringBuilder> {

        protected SpannableStringBuilder doInBackground(String... texts) {
            SpannableStringBuilder buffer = new SpannableStringBuilder()

            ...
            buffer.append("word").append(...)...;

            return buffer;
       }

       protected void onPostExecute(SpannableStringBuilder linkedText) {
            ed.setText(linkedText);
       }
    }
}