我需要从MyService(extends Service)启动新的AsyncLoadJSONDoc(this).execute(),但问题是"这个"不能在那里。 如果我在Activity工作没有问题,我只需要创建构造函数来获取asynctask中的活动。 主要问题是我需要在服务的asynctask中打开我的数据库(空指针异常) 服务正在检查云以获取新信息并保存在android数据库中。 (每分钟)
public class AsyncLoadJSONDoc extends AsyncTask<URL, Integer, ArrayList<Storage.JSONDocument>> {
private static final String TAG = "AsyncLoadJSONDoc";
Activity mActivity;`
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSS'Z'");
Date date = new Date();
private static final String TAG = "AsyncLoadJSONDoc";
Activity mActivity;
public AsyncLoadJSONDoc(Activity activity){
mActivity = activity;
}
@Override
protected ArrayList<Storage.JSONDocument> doInBackground(URL... params) {
StorageService storageService = App42API.buildStorageService();
Storage storage = storageService.findAllDocuments(
Constants.CLOUD_DB_NAME, Constants.COLLECTION_NAME);
ArrayList<Storage.JSONDocument> jsonDocList = storage.getJsonDocList();
Log.i(TAG, "Velikost databaze> " + jsonDocList.size());
return jsonDocList;
}
protected void onPostExecute(ArrayList<Storage.JSONDocument> jsonDocList) {
saveToDatabase(jsonDocList);
}
private void saveToDatabase(ArrayList<Storage.JSONDocument> jsonDocs) {
Log.i(TAG, "saveToDatabase");
Log.i(TAG + " Start>", df.format(date));
SQLiteDatabase db = (new DatabaseHelper(mActivity)).getWritableDatabase(); // <---There is null exception
ContentValues cv=new ContentValues();
DatabaseHelper dq = new DatabaseHelper(mActivity);
dq.onUpgrade(db, 1, 2);
for(Storage.JSONDocument oneJsonDoc : jsonDocs) {
cv.put(Constants.UPDATED_AT, oneJsonDoc.getUpdatedAt());
cv.put(Constants.CREATED_AT, oneJsonDoc.getCreatedAt());
cv.put(Constants.DOC_ID, oneJsonDoc.getDocId());
cv.put(Constants.JSON, oneJsonDoc.getJsonDoc());
if (oneJsonDoc.getLocation() == null) {
Log.i(TAG, "Location NULL");
cv.put(Constants.LATITUDE, (byte[]) null);
cv.put(Constants.LONGITUDE, (byte[]) null);
} else {
cv.put(Constants.LATITUDE, oneJsonDoc.getLocation().getLat().floatValue());
cv.put(Constants.LONGITUDE, oneJsonDoc.getLocation().getLng().floatValue());
}
db.insert(Constants.TABLE_NAME, Constants.JSON, cv);
Log.i(TAG, "insert");
}
db.close();
Log.i(TAG + " End>", df.format(date));
}
}
答案 0 :(得分:0)
这是一个非常简单的修复,DatabaseOpenHelper
只需要一个上下文,而不是实际的活动,所以你可以只改变构造函数:
public class AsyncLoadJSONDoc extends AsyncTask<URL, Integer, ArrayList<Storage.JSONDocument>> {
private Context mContext;
public AsyncLoadJSONDoc(Context context){
mContext = context.getApplicationContext();
}
并替换为mContext
new DatabaseHelper(mContext)
你也应该删除这些行:
DatabaseHelper dq = new DatabaseHelper(mActivity);
dq.onUpgrade(db, 1, 2);
他们完全错了。您永远不应该致电onUpgrade
,系统会在必要时自动为您拨打电话。