我的应用程序无法在Android Studio上运行,我得到:E/BitmapFactory:无法解码流:java.io.FileNotFoundException。



这是我的代码:

package edu.huflit.comicsapp1;
public class App extends Application {
public static ArrayList<Comics> data;
@Override
public void onCreate() {
super.onCreate();
if (data == null) {
data = new ArrayList<>();
}
}
public static Bitmap getBitmapFromURL(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
return BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static Bitmap readBitmapFile(String path){
return BitmapFactory.decodeFile(path);
}

public static ArrayList<Comics> initDataForComics(){
data.add(new Comics("SakamotoDays", readBitmapFile("https://i.pinimg.com/564x/57/2c/02/572c021d470fc2d22062d50a8df4a2cc.jpg")) );
return data;
}
}

如果我用readBitmapFile函数运行这段代码,我的应用程序会运行,但它不显示图像,它显示错误:

E/BitmapFactory:无法解码流:
java.io。FileNotFoundException: https:/i.pinimg.com/564x/57/2c/02/572c021d470fc2d22062d50a8df4a2cc.jpg: open failed: enent (No such file or directory)

如果我用getBitmapfromURL函数运行这段代码,我的应用程序不会运行,我不知道为什么。

这是我的适配器:
package edu.huflit.comicsapp1;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class ComicsAdapter extends RecyclerView.Adapter<ComicsAdapter.ComicsVH> {

ArrayList<Comics> lstComics;
public ComicsAdapter(ArrayList<Comics> lstComics) {
this.lstComics = lstComics;
}
@NonNull
@Override
public ComicsVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.comics_rows,parent,false);
return new ComicsVH(view);
}
@Override
public void onBindViewHolder(@NonNull ComicsVH holder, int position) {
Comics comics = lstComics.get(position);
holder.imgComics.setImageBitmap(comics.getImage());
holder.titleComics.setText(comics.getName());
}
@Override
public int getItemCount() {
return lstComics.size();
}
static class ComicsVH extends RecyclerView.ViewHolder{
ImageView imgComics;
TextView titleComics;
public ComicsVH(@NonNull View itemView) {
super(itemView);
imgComics = itemView.findViewById(R.id.imgComics);
titleComics = itemView.findViewById(R.id.titleComics);
}
}

}

这是我的MainActivity:

package edu.huflit.comicsapp1;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

RecyclerView rvComics;
ComicsAdapter comicsAdapter;
ArrayList<Comics> lstComics;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rvComics = findViewById(R.id.rvComics);
lstComics = App.initDataForComics();
comicsAdapter = new ComicsAdapter(lstComics);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this,
      LinearLayoutManager.VERTICAL,
      false);
rvComics.setLayoutManager(linearLayoutManager);
rvComics.addItemDecoration(new DividerItemDecoration(MainActivity.this,DividerItemDecoration.VERTICAL));
rvComics.setAdapter(comicsAdapter);
}

}

这是我的漫画。java:

package edu.huflit.comicsapp1;
import android.graphics.Bitmap;
import android.net.Uri;
import org.w3c.dom.Text;
import java.lang.reflect.Array;
import java.net.URI;
import java.util.ArrayList;
public class Comics {
int id;
String name;
int category;
int views;
int likes;
Bitmap image;
public Comics(String name, Bitmap image) {
this.name = name;
this.image = image;
}
public String getName() {
return name;
}
public Bitmap getImage() {
return image;
}
public void setName(String name) {
this.name = name;
}
public void Image(Bitmap image) {
this.image = image;
}
}

你应该从另一个线程调用getBitmapFromURL(String src)函数。

像这样修改你的Comics类:

public class Comics {
int id;
String name;
int category;
int views;
int likes;
String imageUrl;
public Comics(String name, String imageUrl) {
this.name = name;
this.imageUrl= imageUrl;
}
public String getName() {
return name;
}
public String getImageUrl() {
return imageUrl;
}
public void setName(String name) {
this.name = name;
}
public void setImageUrl(String imageUrl) {
this.imageUrl= imageUrl;
}
}

你的onBindViewHolder方法应该是这样的:

@Override
public void onBindViewHolder(@NonNull ComicsVH holder, int position) {
Comics comics = lstComics.get(position);
Runnable r = () -> {
Bitmap bitmap = getBitMapFromUrl(comics.getImageUrl());
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
holder.imgComics.setImageBitmap(bitmap);
}
});
};
Thread t = new Thread(r);
t.start();

holder.titleComics.setText(comics.getName());
}

或者您可以使用更简单的Glide库:

这是gradle:

repositories {
    google()
mavenCentral()
}
dependencies {
    implementation 'com.github.bumptech.glide:glide:4.15.1'
}

这是适配器的功能:

@Override
public void onBindViewHolder(@NonNull ComicsVH holder, int position) {
Comics comics = lstComics.get(position);
Glide.with(this).load(comics.getImageUrl()).into(holder.imgComics);

holder.titleComics.setText(comics.getName());
}

最新更新