过去的几个小时我一直在试图找出问题所在,但我无法找出确切的问题是什么。
我正在创建WhatsApp贴纸应用程序。首次打开活动时,游标返回null,但在另一次尝试后返回确切数目的值。这是日志(这是我在重新安装应用程序后打开EntryActyivty时看到的信息,但是关闭应用程序后错误消失了)
E/EntryActivity: error fetching sticker packs
android.database.CursorIndexOutOfBoundsException: After last row.
at android.database.MatrixCursor.get(MatrixCursor.java:73)
at android.database.MatrixCursor.getString(MatrixCursor.java:254)
at android.database.CursorWrapper.getString(CursorWrapper.java:137)
at com.ak455.stickermaker.WhatsAppBasedCode.StickerPackLoader.fetchFromContentProvider(StickerPackLoader.java:113)
at com.ak455.stickermaker.WhatsAppBasedCode.StickerPackLoader.fetchStickerPacks(StickerPackLoader.java:61)
at com.ak455.stickermaker.WhatsAppBasedCode.EntryActivity$LoadListAsyncTask.doInBackground(EntryActivity.java:98)
at com.ak455.stickermaker.WhatsAppBasedCode.EntryActivity$LoadListAsyncTask.doInBackground(EntryActivity.java:85)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
E/EntryActivity: error fetching sticker packs, After last row.
这是我的输入活动:
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_entry);
overridePendingTransition(0, 0);
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}
progressBar = findViewById(R.id.entry_activity_progress);
loadListAsyncTask = new LoadListAsyncTask(this);
loadListAsyncTask.execute();
}
private void showStickerPack(ArrayList<StickerPack> stickerPackList) {
progressBar.setVisibility(View.GONE);
if (stickerPackList.size() > 1) {
final Intent intent = new Intent(this, StickerPackListActivity.class);
intent.putParcelableArrayListExtra(StickerPackListActivity.EXTRA_STICKER_PACK_LIST_DATA, stickerPackList);
startActivity(intent);
finish();
overridePendingTransition(0, 0);
} else {
Log.d(TAG, "showStickerPack: Here1");
final Intent intent = new Intent(this, StickerPackDetailsActivity.class);
intent.putExtra(StickerPackDetailsActivity.EXTRA_SHOW_UP_BUTTON, false);
intent.putExtra(StickerPackDetailsActivity.EXTRA_STICKER_PACK_DATA, stickerPackList.get(0));
startActivity(intent);
finish();
overridePendingTransition(0, 0);
}
}
private void showErrorMessage(String errorMessage) {
progressBar.setVisibility(View.GONE);
Log.e("EntryActivity", "error fetching sticker packs, " + errorMessage);
final TextView errorMessageTV = findViewById(R.id.error_message);
errorMessageTV.setText(getString(R.string.error_message, errorMessage));
}
@Override
protected void onDestroy() {
super.onDestroy();
if (loadListAsyncTask != null && !loadListAsyncTask.isCancelled()) {
loadListAsyncTask.cancel(true);
}
}
static class LoadListAsyncTask extends AsyncTask<Void, Void, Pair<String, ArrayList<StickerPack>>> {
private final WeakReference<EntryActivity> contextWeakReference;
LoadListAsyncTask(EntryActivity activity) {
this.contextWeakReference = new WeakReference<>(activity);
}
@Override
protected Pair<String, ArrayList<StickerPack>> doInBackground(Void... voids) {
ArrayList<StickerPack> stickerPackList;
try {
final Context context = contextWeakReference.get();
if (context != null) {
stickerPackList = StickerPackLoader.fetchStickerPacks(context);
if (stickerPackList.size() == 0) {
return new Pair<>("could not find any packs", null);
}
for (StickerPack stickerPack : stickerPackList) {
StickerPackValidator.verifyStickerPackValidity(context, stickerPack);
}
return new Pair<>(null, stickerPackList);
} else {
return new Pair<>("could not fetch sticker packs", null);
}
} catch (Exception e) {
Log.e("EntryActivity", "error fetching sticker packs", e);
return new Pair<>(e.getMessage(), null);
}
}
@Override
protected void onPostExecute(Pair<String, ArrayList<StickerPack>> stringListPair) {
final EntryActivity entryActivity = contextWeakReference.get();
if (entryActivity != null) {
if (stringListPair.first != null) {
entryActivity.showErrorMessage(stringListPair.first);
} else {
entryActivity.showStickerPack(stringListPair.second);
}
}
}
}
这是我的fetchStickerPacks方法:
public static ArrayList<StickerPack> fetchStickerPacks(Context context) throws IllegalStateException {
mContext = context;
final Cursor cursor = context.getContentResolver().query(StickerContentProvider.AUTHORITY_URI, null, null, null, null);
if (cursor == null) {
throw new IllegalStateException("could not fetch from content provider, " + CONTENT_PROVIDER_AUTHORITY);
}
HashSet<String> identifierSet = new HashSet<>();
final ArrayList<StickerPack> stickerPackList = fetchFromContentProvider(cursor);
for (StickerPack stickerPack : stickerPackList) {
if (identifierSet.contains(stickerPack.identifier)) {
throw new IllegalStateException("sticker pack identifiers should be unique, there are more than one pack with identifier:" + stickerPack.identifier);
} else {
identifierSet.add(stickerPack.identifier);
}
}
if (stickerPackList.isEmpty()) {
throw new IllegalStateException("There should be at least one sticker pack in the app");
}
for (StickerPack stickerPack : stickerPackList) {
final List<Sticker> stickers = getStickersForPack(context, stickerPack);
stickerPack.setStickers(stickers);
StickerPackValidator.verifyStickerPackValidity(context, stickerPack);
}
return stickerPackList;
}
和fetchFromContentProvider方法:
private static ArrayList<StickerPack> fetchFromContentProvider(Cursor cursor) {
ArrayList<StickerPack> stickerPackList = new ArrayList<>();
Log.d(TAG, "fetchFromContentProvider: " + cursor.getCount());
cursor.moveToFirst();
do {
final String identifier = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_IDENTIFIER_IN_QUERY));
final String name = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_NAME_IN_QUERY));
final String publisher = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_PUBLISHER_IN_QUERY));
final String trayImage = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_ICON_IN_QUERY));
final String androidPlayStoreLink = cursor.getString(cursor.getColumnIndexOrThrow(ANDROID_APP_DOWNLOAD_LINK_IN_QUERY));
final String iosAppLink = cursor.getString(cursor.getColumnIndexOrThrow(IOS_APP_DOWNLOAD_LINK_IN_QUERY));
final String publisherEmail = cursor.getString(cursor.getColumnIndexOrThrow(PUBLISHER_EMAIL));
final String publisherWebsite = cursor.getString(cursor.getColumnIndexOrThrow(PUBLISHER_WEBSITE));
final String privacyPolicyWebsite = cursor.getString(cursor.getColumnIndexOrThrow(PRIVACY_POLICY_WEBSITE));
final String licenseAgreementWebsite = cursor.getString(cursor.getColumnIndexOrThrow(LICENSE_AGREENMENT_WEBSITE));
SharedPreferences preferences = mContext.getSharedPreferences(mContext.getString(R.string.preference_file_key), Context.MODE_PRIVATE);
String psp = mContext.getString(R.string.personal_stickers);
String from = preferences.getString(mContext.getString(R.string.from), psp);
final StickerPack stickerPack = new StickerPack(identifier, name, publisher, trayImage, publisherEmail, publisherWebsite, privacyPolicyWebsite, licenseAgreementWebsite);
stickerPack.setAndroidPlayStoreLink(androidPlayStoreLink);
stickerPack.setIosAppStoreLink(iosAppLink);
stickerPackList.add(stickerPack);
} while (cursor.moveToNext());
return stickerPackList;
}