Android Picasso:方法调用应该从主线程发生

问题描述 投票:0回答:2

我想从服务器获取信息,包括照片。我创建了一个名为ServerManager的类,它允许我下载所需的信息。但是,我不能用毕加索下载图像因为我得到了java.lang.IllegalStateException: Method call should happen from the main thread.

这就是我在ServerManager所做的事情:

// Check if the photo is already downloaded
if (!checkInternalPhoto(member)) {
    final String outputURL = context.getFilesDir().getAbsolutePath() + "/" + member.photoPath;
    String photoURL = rootURL + "photos/" + member.photoPath;
    Picasso.with(context)
            .load(photoURL)
            .into(new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    File file = new File(outputURL);
                    try {
                        file.createNewFile();
                        FileOutputStream outputStream = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream);
                        outputStream.flush();
                        outputStream.close();
                    } catch (IOException e) {
                        Log.e("IOException",e.getLocalizedMessage());
                    }
                }
                @Override
                public void onBitmapFailed(Drawable errorDrawable) {
                }
                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {
                }
    });
}

我能做什么?

编辑:我试图使用我的MainActivity中的代码,我得到相同的错误消息...

 public void downloadPhotos(List<Member> memberList){
    String rootInURL = serverManager.getRootURL();
    String rootOutURL = serverManager.getOutputURL();
    for(int i = 0; i < memberList.size(); i++){
        if(!serverManager.checkInternalPhoto(memberList.get(i))){
            final String outputURL = rootOutURL + memberList.get(i).photoPath;
            String photoURL = rootInURL + "photos/" + memberList.get(i).photoPath;
            Picasso.with(this)
                    .load(photoURL)
                    .into(new Target() {
                        @Override
                        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                            File file = new File(outputURL);
                            try{
                                file.createNewFile();
                                FileOutputStream outputStream = new FileOutputStream(file);
                                bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream);
                                outputStream.flush();
                                outputStream.close();
                                Toast.makeText(context, "YEpa: " ,Toast.LENGTH_LONG).show();
                            } catch (IOException e){
                                Toast.makeText(context, "Error: " + e.toString(),Toast.LENGTH_LONG).show();
                            }
                        }

                        @Override
                        public void onBitmapFailed(Drawable errorDrawable) {

                        }

                        @Override
                        public void onPrepareLoad(Drawable placeHolderDrawable) {

                        }
                    });
        }
    }
}
java android picasso
2个回答
1
投票

您不能从与创建该ui元素的线程不同的线程更新ui元素。在Android上几乎总是意味着主线程。

您需要做的是将photoUrl字符串发送回主线程上的活动或片段。传统的做法是使用Handler。你可以在这里阅读更多信息:https://developer.android.com/training/multiple-threads/communicate-ui.html


0
投票

试试这个,你的错误就会消失。在单元Android测试中使用它时,总会发生此问题

kotlin代码

 Handler(Looper.getMainLooper()).post {
 }

java代码

new Handler(Looper.getMainLooper()).post(() -> {
});
© www.soinside.com 2019 - 2024. All rights reserved.