Я читаю некоторые данные из БД в потоке 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() может принимать только один параметр!!!!
Может кто-нибудь помочь мне с этим? спасибо
Следующее должно работать, если у вас есть значения данных в правильном порядке (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
Рассмотрим пользовательский объект, который обертывает два значения и передает этот объект как Прогресс, как в:
private class MyAsynch extends AsyncTask<Void,MyObject,Void>{
JAL
Вы можете оставить их и 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);
}
}
}
onProgressUpdate()
? Проверьте, что длина массива значений равна 2 каждый раз, и посмотрите на их значения. Исключение говорит вам, что значение не может быть разобрано как число с плавающей точкой.