Java 如何从sqlite获取数据,并使用stackwidget显示数据?

Java 如何从sqlite获取数据,并使用stackwidget显示数据?,java,android,android-sqlite,Java,Android,Android Sqlite,我想从sqlite中检索url图像,然后将其转换为位图并显示到stackwidget中。手动逐个插入url图像时,效果良好。但当我使用sqlite的url图像时,应用程序是强制关闭的,我的stackwidget不显示图像 public class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { ... StackRemoteViewsFactory(Context context)

我想从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();
    ...

}
公共类StackRemoteViewsFactory实现RemoteViewsService.RemoteViewsFactory{
...
StackRemoteViewsFactory(上下文){
mContext=上下文;
}
@凌驾
public void onCreate(){
FilmHelper FilmHelper=FilmHelper.getInstance(mContext);
filmHelper.open();
}
@凌驾
公共无效onDataSetChanged(){
数据库助手数据库助手;
databaseHelper=新的databaseHelper(mContext);
SQLiteDatabase databases=databaseHelper.getReadableDatabase();
long count=DatabaseUtils.queryNumEntries(数据库,“注释”);
ArrayList ini=新的ArrayList();
游标c=FilmHelper.database.rawQuery(“SELECT*FROM note”,null);
c、 moveToFirst();
电影笔记;
int i;
如果(c.getCount()>0){
对于(i=0;i
您正在执行网络消耗任务,例如在主线程的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();
    }
}}
类ConvertUrltoBitmap扩展了异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
公共位图doInBackground(字符串…URL){
位图映射=空;
试一试{
URL=新URL(URL[0]);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream输入=连接。getInputStream();
map=BitmapFactory.decodeStream(输入);
}捕获(例外e){
e、 printStackTrace();
}
返回图;
}
受保护的void onPostExecute(位图){
试一试{
添加(位图);
}捕获(异常){
异常。printStackTrace();
}
}}

您正在执行网络消耗任务,例如在主线程的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();
    }
}}
类ConvertUrltoBitmap扩展了异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
公共位图doInBackground(字符串…URL){
位图映射=空;
试一试{
URL=新URL(URL[0]);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream输入=连接。getInputStream();
map=BitmapFactory.decodeStream(输入);
}捕获(例外e){
e、 printStackTrace();
}
返回图;
}
受保护的void onPostExecute(位图){
试一试{
添加(位图);
}捕获(异常){
异常。printStackTrace();
}
}}