проблема с потоком AsyncTask - PullRequest
1 голос
/ 01 июня 2011

Я читаю некоторые данные из БД в потоке 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] и время [i], я должен отправить их на

protected void onProgressUpdate(....?) {

}

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

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

Ответы [ 3 ]

0 голосов
/ 01 июня 2011

Следующее должно работать при условии, что вы получили значения данных в правильном порядке (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 голосов
/ 02 июня 2011

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

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

JAL

0 голосов
/ 01 июня 2011

Вы можете оставить их как String и передать массив String [] в publishProgress (), сохраняя тот же порядок, а затем преобразовать значение viteza [i] в ​​число с плавающей точкой в ​​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);
    }

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...