我在創建Android Studio中的Android應用程序的過程中獲得URL的圖像。一路上我遇到了一些麻煩。我正在使用一個非常標準的ListView,可以添加和刪除項目 - 這一點是完美的。爲了將數據存儲在用戶手機上(因爲我還沒有自己的服務器),我選擇將數據存儲在用戶的手機上。問題下載從SQLite數據庫
爲了存儲數據爲我所用下面的教程,但改變了一些列的名稱和添加列,以滿足我的需求http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/創建一個SQLite數據庫的應用程序。
一個我創建的列包含一個URL來電影海報圖像。我的對象類下載這個圖像,並將其設置爲一個Drawable - 這一點也是完美的。我能夠成功地將URL存儲在數據庫中,並在重新加載應用程序時正確取出。但是,當我重新加載應用程序時,即使將正確的URL傳遞給Object類,ListView中的項目也不會下載圖像。請幫我看看我哪裏出錯了。代碼如下。提前致謝!
數據庫助手(在這裏我CRUD SQLite數據庫)
public class DatabaseHandler extends SQLiteOpenHelper{
//database version
private static final int DATABASE_VERSION = 1;
//database name
private static final String DATABASE_NAME = "moviesManager";
//table name
private static final String TABLE_MOVIES = "movies";
//table column names
private static final String KEY_ID = "idSTRING";
private static final String KEY_TITLE = "Title";
private static final String KEY_YEAR = "Year";
private static final String KEY_RATING = "Rating";
private static final String KEY_POSTER = "URL";
public DatabaseHandler(Context context){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
//creating tables
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_MOVIES_TABLE = "CREATE TABLE " + TABLE_MOVIES + "("
+ KEY_ID + "STRING PRIMARY KEY," + KEY_TITLE + " TEXT,"
+ KEY_YEAR + " TEXT," + KEY_RATING + " TEXT,"
+ KEY_POSTER + " TEXT" + ")";
db.execSQL(CREATE_MOVIES_TABLE);
}
//upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_MOVIES);
//create table again
onCreate(db);
}
//CRUD (Create, Read, Update, Delete) Operations
//add new movie
void addMovie(Movie movie){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ID, movie.getId());
values.put(KEY_TITLE, movie.getTitle());
values.put(KEY_YEAR, movie.getYear());
values.put(KEY_RATING, movie.getRating());
values.put(KEY_POSTER, movie.getImgUrl());
//Log.e("poster:", values.get(KEY_POSTER).toString());
//Inserting row
db.insert(TABLE_MOVIES, movie.getId(), values);
//Log.e("Poster in DB: ",getMovie(movie.getId()).getImgUrl());
db.close(); //closing database connection
}
public List<Movie> getAllMovies(){
List<Movie> movieList = new ArrayList<>();
String selectQuery = "SELECT * FROM " + TABLE_MOVIES;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
//looping through all rows and adding to list
if(cursor.moveToFirst()) {
do{
Movie movie = new Movie();
movie.setId(cursor.getString(0));
movie.setTitle(cursor.getString(1));
movie.setYear(cursor.getString(2));
movie.setRating(cursor.getString(3));
movie.setPoster(cursor.getString(4));
movieList.add(movie);
}while(cursor.moveToNext());
}
//cursor.close();
return movieList;
}
...
}
從MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
...
lv = (ListView) findViewById(R.id.list);
movies = db.getAllMovies();
mAdapter = new MovieAdapter(this, movies);
lv.setAdapter(mAdapter);
...
}
從電影類:
...
public void setPoster(String imgUrl) {
this.imgUrl = imgUrl;
this.poster = LoadImageFromWebOperations(this.imgUrl);
}
private static Drawable LoadImageFromWebOperations(String url) {
try {
InputStream is = (InputStream) new URL(url).getContent();
return Drawable.createFromStream(is, "src name");
} catch (Exception e) {
Log.e("err","poster not found at "+url);
return null;
}
}
讓我知道,如果需要更多的信息回答我的問題。
這可能不相關,但可能會解決一些你的未來的問題。你有沒有看過使用圖像加載庫,如Glide或Picasso?https://github.com/bumptech/glide http://square.github.io/picasso/ – riggaroo
@riggaroo我會研究這些庫。我對android開發相對來說比較陌生,試圖讓我的腳在這裏,但還沒有探索外部庫。 – JFKDevelopers
好吧,通常試圖做你自己的圖像加載和緩存可能是一場噩夢,這就是爲什麼像這樣的圖書館存在。 – riggaroo