首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“动画师只能在活套线程上运行”错误时,从资产文件夹(Android)将图像加载到ImageView

“动画师只能在活套线程上运行”错误时,从资产文件夹(Android)将图像加载到ImageView
EN

Stack Overflow用户
提问于 2021-01-12 21:21:29
回答 1查看 158关注 0票数 0

我正在尝试构建一些方法,允许我使用图像的名称一次从本地文件夹加载一个.png图像。我选择从assets文件夹加载,因为res文件夹没有按图像名加载。在阅读了相当多的问答之后,我提出了以下方法:

代码语言:javascript
复制
    private void setImage(String imageName) {
        String imageReference = String.format("%1$s/%2$s", "images", imageName);
        Context appContext = getContext().getApplicationContext();
        AssetManager assetManager = appContext.getAssets();
        // get input stream
        InputStream inputStream = null;
        try {
            inputStream = assetManager.open(imageReference);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // load image as drawable
        Drawable drawable = null;
        drawable = Drawable.createFromStream(inputStream, null);
        // set image to ImageView
        imageView.setImageDrawable(drawable);
        try {
            inputStream .close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

...where“图像”是资产文件夹中的子目录。使用调试器,我可以看到该方法正在成功地获取图像,但一旦它到达代码imageView.setImageDrawable(drawable);行,模拟器就会抛出以下错误:AndroidRuntimeException: Animators may only be run on Looper threads

就我的用法而言,我曾试图找出这意味着什么,但到目前为止我还是失败了。感激地收到任何帮助/建议:)

编辑:这是我最新的堆栈跟踪,自从我发布问题后(很可能)发生了轻微的变化:

代码语言:javascript
复制
E/AndroidRuntime: FATAL EXCEPTION: Timer-3
    Process: com.example.spineapp.debug, PID: 10369
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7753)
        at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1225)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.widget.ScrollView.requestLayout(ScrollView.java:1533)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.view.View.requestLayout(View.java:23093)
        at android.widget.ImageView.setImageDrawable(ImageView.java:571)
        at android.support.v7.widget.AppCompatImageView.setImageDrawable(AppCompatImageView.java:100)
        at com.spineapp.LeftRightJudgementStepLayout.setImage(LeftRightJudgementStepLayout.java:583)
        at com.spineapp.LeftRightJudgementStepLayout.startQuestion(LeftRightJudgementStepLayout.java:521)
        at com.spineapp.LeftRightJudgementStepLayout.startNextQuestionOrFinish(LeftRightJudgementStepLayout.java:1031)
        at com.spineapp.LeftRightJudgementStepLayout$7.run(LeftRightJudgementStepLayout.java:482)
        at java.util.TimerThread.mainLoop(Timer.java:562)
        at java.util.TimerThread.run(Timer.java:512)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-12 21:41:15

您可能是从一个非UI线程调用setImageDrawable()

尝试在UI线程上调度setImageDrawable

代码语言:javascript
复制
imageView.post(
// or inside an activity use
// runOnUiThread(
  new Runnable() {
    @Override
    public void run() {
      imageView.setImageDrawable(...);
    }
  }
);

https://developer.android.com/reference/android/view/View#post(java.lang.Runnable)

https://developer.android.com/reference/android/app/Activity#runOnUiThread(java.lang.Runnable)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65692234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档