从Firebase实时数据库获取链接异常导致Picasso无法加载图片
Firebase实时数据库获取图片链接格式异常导致Picasso无法加载
从Firebase实时数据库获取图片链接时,链接被自动添加开头{abs=和结尾},导致Picasso无法加载图片,但直接使用正确的纯链接时Picasso可正常加载。
Java代码
public class MainActivity extends AppCompatActivity { private Button button; private TextView tv0, tv1; private String string; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv0 = findViewById(R.id.textView); imageView = findViewById(R.id.imageView); tv1 = findViewById(R.id.textView2); button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("muscles"); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot dataSnapshot : snapshot.getChildren()) { string = snapshot.getValue().toString(); } tv1.setText(string); tv0.setText("{abs=https://firebasestorage.googleapis.com/v0/b/my-application-5272b.appspot.com/o/ts-space-sun-and-solar-viewing-facts-versus-fiction.webp?alt=media&token=264af080-27a5-4177-ade3-6eaf30125383}"); Picasso.get().load("https://firebasestorage.googleapis.com/v0/b/my-application-5272b.appspot.com/o/ts-space-sun-and-solar-viewing-facts-versus-fiction.webp?alt=media&token=264af080-27a5-4177-ade3-6eaf30125383").into(imageView); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } }); }
XML布局代码
<android.widget.Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/button" android:text="Button" android:textColor="@color/white" app:layout_constraintBottom_toTopOf="@+id/textView2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="tt" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toTopOf="@+id/button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.593" tools:srcCompat="@tools:sample/avatars" /> </androidx.constraintlayout.widget.ConstraintLayout>
问题解决方法
原因分析
你当前代码中string = snapshot.getValue().toString();是将整个snapshot对应的对象直接转为字符串,而muscles节点是包含abs键值对的对象,所以转成字符串后会带上{abs=...}的包裹格式。同时循环中错误地使用了外层的snapshot而非循环变量dataSnapshot,导致遍历逻辑无效。
修正方案
方案1:直接提取指定字段值
如果确定只需要abs字段的链接,直接通过child方法获取:
@Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 直接获取abs字段对应的字符串值 string = snapshot.child("abs").getValue(String.class); tv1.setText(string); // 用提取到的纯链接加载图片 Picasso.get().load(string).into(imageView); }
方案2:遍历子节点获取对应值
如果需要遍历muscles下的所有子节点,修正循环逻辑:
@Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot dataSnapshot : snapshot.getChildren()) { // 获取当前子节点的键和值 String key = dataSnapshot.getKey(); if ("abs".equals(key)) { string = dataSnapshot.getValue(String.class); break; } } tv1.setText(string); Picasso.get().load(string).into(imageView); }
修正后,string将是纯图片链接,Picasso可以正常加载图片。
内容的提问来源于stack exchange,提问作者user19595313
相关产品推荐
相关产品推荐

