Как правильно и правильно получить доступ к базе данных SQLite из другого потока - Android

Проблема заключается в том, что вы не показываете результат правильно.

Ваш результат находится в диапазоне 0-31, но вам нужно преобразовать его в 0-255 для его построения!

do

imshow(mat2gray(z))

enter image description here [/g0]

0
задан sticky bit 25 June 2019 в 21:57
поделиться

1 ответ

1) Я думаю, что AsyncTask будет работать, но у меня нет образца этого в наличии. Для чтения / записи БД SQLite я почти всегда использую Runnable (см. Пример ниже).

2) Любая операция с базой данных всегда должна выполняться в другом потоке, потому что существует реальная вероятность того, что ваш запрос займет достаточно много времени, чтобы выполнить ваше приложение, если оно не будет отвечать на запросы в потоке пользовательского интерфейса (например, 3 секунды?) , Ключ просто не блокировать поток пользовательского интерфейса. Но тогда у вас должен быть план, когда завершится фоновая задача, как вы обновляете пользовательский интерфейс? См. Инструкцию runOnUIThread в приведенном ниже примере.

Вот пример, сначала, как вызвать ваш метод:

        final Runnable searchWords = new Runnable() {
             public void run() {
                 readWords();
                }
           };

        Thread thread = new Thread(null, searchWords, "MagentoBackground");
        thread.start(); 

Затем метод:

public void readWords() {

    Edit.listOfWords = new ArrayList<Word>();

    try {

        myDbHelper.openDataBase();

    }catch(SQLException sqle){

        throw sqle;

    }

    Cursor c = null;

    try{

        boolean containsPct = mSearch.contains("%");

        if (containsPct) {
            c = myDbHelper.searchEnableWords(mSearch);  
        } else {
            String sLength = "" + mSearch.length();
            c = myDbHelper.getEnableWords(mSearch, sLength);                    
        }

        if (c.moveToFirst())
        {

            do { 

                Word word = new Word();

                word.word = c.getString(0);
                word.length = word.word.length();
                word.value = wordValue(word.word);
                Edit.listOfWords.add(word);

            } while (c.moveToNext());
        }

        if (c != null) {
            if (!c.isClosed()) {
                c.close();
            }
        }


    } catch (Throwable t){
        Log.e("Word Assist",t.getMessage(),t);

        if (c != null) {
            if (!c.isClosed()) {
                c.close();
            }
        }

    }

    try {

        myDbHelper.close();

    }catch(SQLException sqle){

        throw sqle;

    }

    Collections.sort(Edit.listOfWords, new WordComparator());
    adapter = new WordAdapter(this, Edit.listOfWords);


    runOnUiThread(returnRes);

}

Затем выполните то, что вам нужно в потоке пользовательского интерфейса:

private Runnable returnRes = new Runnable() {
    @Override
    public void run() {

        mProgressDialog.dismiss();
        list.setAdapter(adapter);

        if (Edit.listOfWords.size() == 0) {
            empty.setVisibility(View.VISIBLE);
        } else {
            empty.setVisibility(View.GONE);
        }


    }

};

Вот пример AsyncTask:

private class GetPetDetails extends AsyncTask<String, Void, String> {
    ProgressDialog dialog;    

    @Override     
    protected void onPreExecute() {   

        dialog = new ProgressDialog(thisContext);         
        dialog.setMessage("Loading, please wait...");         
        dialog.setIndeterminate(true);         
        dialog.setCancelable(false);         
        dialog.show();     


        }

    protected String doInBackground(String... urls) {

        String animal_breed = urls[0];
        String results = "";

        try{

            results = myDbHelper.getBreedDetails(animal_breed);

        } catch (Throwable t){
            Log.e("VCAS",t.getMessage(),t);
        }

        return results;
    }

    protected void onPostExecute(String results) {
        dialog.dismiss(); 

        breedDetails = results;
        displayDetail();



    }

}// 
0
ответ дан Michael Dougan 25 June 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: