首页 > 解决方案 > 如何从 sqlite 获取数据,并使用 stackwidget 显示它?

问题描述

我想从 sqlite 检索 url 图像,然后将其转换为位图并将其显示到 stackwidget 中。手动插入url图片时,效果很好。但是当我使用来自 sqlite 的 url 图像时,应用程序被强制关闭并且我的 stackwidget 不显示图像。

public class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {

 ...

    StackRemoteViewsFactory(Context context) {
        mContext = context;
    }

    @Override
    public void onCreate() {
        FilmHelper filmHelper = FilmHelper.getInstance(mContext);
        filmHelper.open();
    }
    @Override
    public void onDataSetChanged() {

        DatabaseHelper databaseHelper;
        databaseHelper = new DatabaseHelper(mContext);
        SQLiteDatabase databases = databaseHelper.getReadableDatabase();
        long count = DatabaseUtils.queryNumEntries(databases, "note");

        ArrayList<Film> ini = new ArrayList<>();

        Cursor c =FilmHelper.database.rawQuery("SELECT * FROM note" , null );

        c.moveToFirst();

        Film note;
        int i;
            if (c.getCount() > 0) {
                for (i=0; i < count; i++  ) {
                    do {
                        note = new Film();
                        note.setId(c.getInt(c.getColumnIndexOrThrow(_ID)));
                        note.setPosterPath(c.getString(c.getColumnIndexOrThrow(IMAGE)));
                        ini.add(note);
                        try {
                            URL url = new URL("https://image.tmdb.org/t/p/w600_and_h900_bestv2/" +
                                    ini.get(i).getPosterPath());
                            Bitmap image = BitmapFactory.decodeStream(url.openStream());
                            mWidgetItems.add(image);
                        } catch (IOException e) {
                            System.out.println(e);
                        }
                        c.moveToNext();
                    } while (!c.isAfterLast());
                }
            }
            c.close();
            databases.close();
    ...

}

标签: javaandroidandroid-sqlite

解决方案


您正在执行网络消耗任务,例如在主线程的 forloop 中将 url 转换为位图。
您可以使用 Asynctask 在 onPostExecute 中从 url 下载位图给您,然后您可以将位图添加到 mWidgetItems。

class ConvertUrltoBitmap extends AsyncTask<String, Void, Bitmap> {
@Override
protected void onPreExecute() {
    super.onPreExecute();
}
public Bitmap doInBackground(String... urls) {
    Bitmap map = null;
    try {
        URL url = new URL(urls[0]);
        HttpURLConnection connection =(HttpURLConnection)url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        map= BitmapFactory.decodeStream(input);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return map;
}

protected void onPostExecute(Bitmap bitmap){
    try {
        mWidgetItems.add(bitmap);
    }catch (Exception exception){
        exception.printStackTrace();
    }
}}

推荐阅读