java - AsyncTask 中的进度条崩溃

标签 java android android-asynctask android-progressbar

AsyncTask 中的进度条导致崩溃。此代码本质上是从 URL 加载图像,并在执行此操作时显示进度微调器。组中的第一张图像加载正常,但随后应用程序崩溃。

public class LoadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
ProgressBar progressBar;

public LoadImageTask(ImageView bmImage, ProgressBar progressBar) {
    this.bmImage = bmImage;
    this.progressBar = progressBar;
}

protected Bitmap doInBackground(String... urls) {
    progressBar.setVisibility(View.VISIBLE);
    String urldisplay = urls[0];
    Bitmap scaledImage = null;
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        Bitmap image = BitmapFactory.decodeStream(in);

        scaledImage = Bitmap.createScaledBitmap(image, 380, 250, false);
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return scaledImage;
}

protected void onPostExecute(Bitmap result) {
    progressBar.setVisibility(View.GONE);
    bmImage.setImageBitmap(result);
}

}

控制台打印输出:

 02-03 02:45:44.014  24125-24375/simplewall.ryandushane.com.simplewall E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #5
    Process: simplewall.ryandushane.com.simplewall, PID: 24125
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
            at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6247)
            at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:867)
            at android.view.View.requestLayout(View.java:17364)
            at android.view.View.requestLayout(View.java:17364)
            at android.view.View.requestLayout(View.java:17364)
            at android.view.View.requestLayout(View.java:17364)
            at android.view.View.requestLayout(View.java:17364)
            at android.view.View.requestLayout(View.java:17364)
            at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360)
            at android.view.View.requestLayout(View.java:17364)
            at android.widget.AbsListView.requestLayout(AbsListView.java:1975)
            at android.view.View.requestLayout(View.java:17364)
            at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360)
            at android.view.View.requestLayout(View.java:17364)
            at android.view.View.setFlags(View.java:9633)
            at android.view.View.setVisibility(View.java:6663)
            at android.widget.ProgressBar.setVisibility(ProgressBar.java:1563)
            at simplewall.ryandushane.com.simplewall.LoadImageTask.doInBackground(LoadImageTask.java:27)
            at simplewall.ryandushane.com.simplewall.LoadImageTask.doInBackground(LoadImageTask.java:17)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

最佳答案

CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

因为您正在从在非 ui 线程上运行的 doInBackground 调用 progressBar.setVisibility 方法。

重写在主 UI 线程上运行的 AsyncTaskonPreExecute() 方法来更改进度条的可见性:

@Override
protected void onPreExecute() {
     progressBar.setVisibility(View.VISIBLE);
}

关于java - AsyncTask 中的进度条崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28293805/

相关文章:

java - 改变牙套的样式

java - 一旦另一个 spring bean 被初始化,有没有人有一个好的模式来初始化一个 spring bean?

java - 如何从连接到 Android 设备的串行 GPS 获取数据?

android - 允许 AsyncTask 操作不同 Activity 类中的值

android - 获取 MultiDex 错误,即使在设置 Min SDK 21 之后

android - 如何在调用新的异步任务时终止以前的任务

java - 为 AsyncTask 实现一个常规的 JSON 解析器函数

java - org.json.JSONObject 无法转换为 Serialized_JSONObject

java - 64 位 Linux 上的意外 JVM 行为

android - 全局 AsyncTask 类中未显示进度对话框