java - 如何从 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();
...
}
解决方案
您正在执行网络消耗任务,例如在主线程的 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();
}
}}
推荐阅读
- c# - 必填字段为空时如何取消按钮单击操作?
- python - 一行上的sqlalchemy bulk_save_objects错误
- .net-core - 如何找到 nuget 为 PackageReference 选择的确切版本?
- ffmpeg - youtube-dl 有一个 3gp 文件,显然它不包含任何视频流。有没有办法播放视频?
- python - 在 PyQt5 中使用 xtics 时 python 崩溃
- javascript - 错误:在 Windows 7 上生成 git ENOENT
- c# - 如何将特定按钮按下记录到 xml?
- javascript - 在异步计时中调用 Javascript 函数
- python - 无法将 TensorFlow 模型冻结到冻结(.pb)文件中
- c# - NuGet、Packages.config、.csproj 和参考