首次打开活动时,光标返回null

时间:2018-12-11 18:30:46

标签: java android cursor

过去的几个小时我一直在试图找出问题所在,但我无法找出确切的问题是什么。

我正在创建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;
    }

0 个答案:

没有答案