0

我有一堆按钮(自定义,有一些额外的方法来应用其他背景,并恢复为原始),可以为其分配背景。但由于我不知道这些背景会或可以有多大,我决定将背景设置在单独的线程中。首先,我有这个代码:

public void updateButton(final Button b, final String d, final String s) {
    b.nullify(); //Recycles previous background, else OOM error
    b.setText(s);
    if (d != null) {
        new Thread() {
            @Override
            public void run() {
                b.setBackgroundFromBase64(d);
            }
        }.run();
    }
    else b.setBackgroundToDefault(); //Sets standard android background
}

但我很快发现这不是要走的路。慢慢地,当我调用这个方法几千次时,内存被淹没了。当我移除new Thread()部件时,内存没有被淹没,所以线程是造成这种情况的原因(内存分析器工具告诉我同样的)。

然后我尝试了AsyncTask

private class UpdateButtonTask extends AsyncTask<Object, Void, Void> {
    @Override 
    protected Void doInBackground(Object... objs) {
        String s = (String)objs[0];
        Button b = (Button)objs[1];
        String d = (String) objs[2];
        b.nullify(); //Recycles previous background, else OOM error
        b.setText(s);
        if (d != null) b.setBackgroundFromBase64(d);
        else b.setBackgroundToDefault();
        return null;
     }
     @Override
     protected void onProgressUpdate(Void v) {
         //As far as I know, I don't need this method
     }
     @Override
     protected void onPostExecute(Void v) {
         //Neither this one
     }
 }

并打电话

new UpdateButtonTask().execute("Button", myButton, base64String);

在按钮更新方法中。但这也不起作用(按钮根本没有更新。没有文字,没有自定义背景)。我阅读了一些关于线程的文章和问题(thisthisthis等),但我似乎无法让它工作。目前,没有Thread 并希望手机足够快而不会在 UI 线程上造成麻烦似乎是最好的选择,但我宁愿拥有更可靠的东西,比如 Thread。 我究竟做错了什么?或者可能只是完整的问题如何在背景线程上更新按钮背景(因此在应用更大的背景时 UI 不会停止工作)

4

2 回答 2

0

我猜问题在于您正在尝试在非 UI 线程上更新 UI。这会引发异常并杀死您的AsyncTask.

您应该将处理密集型任务分开AsyncTask,然后在主线程上应用 UI 更改(使用runOnUiThread(Runnable))。

由于您使用的是自定义按钮,我真的不知道您不允许在非 UI 线程上做什么。我猜这个setText函数会导致问题,如果你没有覆盖它的话。

您应该首先将整个doInBackground方法体包装在一个try/catch块中并记录异常以隔离问题。

于 2012-10-11T14:24:49.927 回答
-1

可能是这段代码会帮助你

new Thread(new Runnable() {

public void run() {

context.runOnUiThread(new Runnable() {

public void run() {
      b.setBackgroundFromBase64(d);
}

});

}

}).start();
于 2012-10-11T14:33:21.297 回答