2013-04-04 75 views
0

我想添加到EditTextClickableSpan in AsynkTaskandroid:无法在doInBackground中调用Looper.prepare()的线程内创建处理程序

我用接下来的代码如下:

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 

而且我应该说,出现不能在所有设备这个问题,一些用户报告说,一切工作正常。

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

回答

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); 
     } 
    } 
} 
+0

非常感谢!它帮助! – lubart 2013-04-04 19:23:01

2

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

只要确保您不会与doInBackground方法中的任何EditText相互作用。

+1

如果必须从后台线程操作UI组件,您仍然可以使用'MyActivity.this.runOnUiThread(..)'从你的任务的'doInBackground'方法 – Thrakbad 2013-04-04 13:19:06

+0

是的,但在这种情况下,操作实际上发生在UI线程上:) – fiddler 2013-04-04 14:07:52

+0

谢谢你的回答! +1,当然,但j0n0的答案更接近我的情况。谢谢! – lubart 2013-04-04 19:25:21

相关问题