проблема с потоком AsyncTask

1

Я читаю некоторые данные из БД в потоке AsyncTask.... таким образом:

    protected Void doInBackground(DBAdapter... db) {

        try {

            db[0].openDataBase();

            Cursor c = db[0].getCursor3(db[0].TABLE_3, user_id);

            float[] viteza = new float[c.getCount()];

            String[] time = new String[c.getCount()];

            if (c.moveToFirst()) {

                do {

                    viteza[i] = Float.parseFloat(c.getString(3));
                    time[i] = c.getString(4);


                    publishProgress(????);

                    Thread.sleep(2500);

                    i++;
                } while (c.moveToNext());

            }
            c.close();
            db[0].close();

        } catch (Exception e) {
            Log.d("Eroare", "doInBackground", e);
        }

        return null;
    }

Моя проблема в том, что каждый раз, когда я получаю новое значение для viteza [i] и time [i], я должен отправить их в

protected void onProgressUpdate(....?) {

}

оба в то же время.... но я не знаю, как это сделать. publishProgress() может принимать только один параметр!!!!

Может кто-нибудь помочь мне с этим? спасибо

Теги:
android-asynctask

3 ответа

0
Лучший ответ

Следующее должно работать, если у вас есть значения данных в правильном порядке (getString (3) должно быть числом, а getString (4) должно быть значением времени).

protected Void doInBackground(DBAdapter... db) {
    // ... some db work
    if (c.moveToFirst()) {
        publishProgress(c.getString(3), c.getString(4));
        // ...
    }
}

protected void onProgressUpdate(String... values) {
    float viteza = Float.parseFloat(values[0]);
    String time = values[1];
    // do something with the data that shows in UI
}

Полная проверка AsyncTask для тестирования передаваемых значений:

private class SimpleTask extends AsyncTask<Void, String, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        String floatAsString = "3.14159265358979";
        String timeAsString = "06-01 07:32:02.579";
        publishProgress(floatAsString, timeAsString);
        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        float pi = Float.parseFloat(values[0]);
        Log.i("SimpleTask", String.format("Got values '%s' and '%s'. pi = %f", values[0], values[1], pi));
    }

}

который печатает вывод:

Got values '3.14159265358979' and '06-01 07:32:02.579'. pi = 3.141593
  • 0
    Я сделал это так .... viteza [contor] = Float.parseFloat (values [0]); и он выдает исключение, и я получаю принудительное закрытие: java.lang.NumberFormatException: 06-01 07: 32: 02.579: ОШИБКА / AndroidRuntime (483): в org.apache.harmony.luni.util.FloatingPointParser.parseFltImpl (собственный метод ) в org.apache.harmony.luni.util.FloatingPointParser.parseFloat (FloatingPointParser.java:321)
  • 0
    Каковы точные значения ваших строк, передаваемых в onProgressUpdate() ? Проверьте, что длина массива значений равна 2 каждый раз, и посмотрите на их значения. Исключение говорит вам, что значение не может быть разобрано как число с плавающей точкой.
Показать ещё 6 комментариев
0

Рассмотрим пользовательский объект, который обертывает два значения и передает этот объект как Прогресс, как в:

private class MyAsynch extends AsyncTask<Void,MyObject,Void>{

JAL

0

Вы можете оставить их и String и передать массив String [] для публикацииProgress(), поддерживая тот же порядок, а затем преобразовать значение viteza [i] в ​​float в publishProgress(). Вы также можете поместить их в суперпростой класс и передать объект, если не хотите беспокоиться о порядке массива, но я бы пошел с массивом для чего-то такого небольшого.

public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    MyAsyncTask myTask = new MyAsyncTask();
    myTask.execute();
}

private class MyAsyncTask extends AsyncTask<Void, String, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        String[] first = {"1", "2", "3", "4", "5"};
        String[] second = {"5", "4", "3", "2", "1"};

        for(int i = 0; i < first.length; i++) {
                            //put together a string array with our values in the desired order
            String[] vals = {first[i], second[i]};
                            //publishProgress is what is used to call onProgressUpdate()
            publishProgress(vals);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(String...strings ) {

                    //Strings are now in strings[0] and strings[1] in the order
                    //that they were put into vals array in doInBackground()
        String passedValues = strings[0] + "," + strings[1];

                    //Do whatever UI updates.
        TextView mytext = (TextView)findViewById(R.id.mytext);
        mytext.setText(passedValues);
    }

}

}

  • 0
    Массив тогда будь;)
  • 0
    У меня есть этот защищенный void onProgressUpdate (String [] ... array) {....} где array [] имеет два элемента .... но array [0] = viteza [0] .... Как я могу получить вернуть мои элементы .... ???
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню