Задать вопрос
  • Как реализовать сохранения таймеров при повороте экрана?

    @dandewine Автор вопроса
    Большое спасибо за ответ! Но вы, наверно невнимательно посмотрели код, и еще выше я человеку в комментарии весь код класса впихнул, проблема больше идеалистическая) Как лучше реализовать. В этом примере я пытался делать через chronometer в каждой row listview, но мне кажется в написанном мною адаптере я допустил логическую ошибку, я уже обращался, что бы не соврать минимум к 20 людям, и никто не смог дать внятного объяснения почему так происходит. Проект я 3 раза переписывал делая все шаг за шагом, все хорошо до двух if'ов там в коде, они закомментированы. Сейчас я переделываю все с использованием Runnable, что бы обновлялся вн. вид экрана, а по нажатию Stop из очереди удалялось соообщение. Целью вопроса было узнать либо в чем конкретно проблема, либо рекомендацию как можно было бы правильно с точки зрения красивого кода/избежание утечек памяти/учета поворота экрана/чистоты кода и тд написать этот маленький модуль приложения.
  • Как реализовать сохранения таймеров при повороте экрана?

    @dandewine Автор вопроса
    public class MainActivity extends ActionBarActivity implements LoaderManager.LoaderCallbacks {

    ListView listView;
    MyAdapter myAdapter;
    private final int LOADER_ID =1;
    SQLiteDatabase db;
    Bundle bundle;
    List lastPauseList;
    List positionnList;
    List startList;
    List basesList;
    List tested;
    List elapsed;
    List trackerList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bundle = savedInstanceState;
    db = RemindMe.db;
    trackerList = Tracker.getListAll(db);
    String[] from = {Tracker.COL_NAME,Tracker.COL_ELAPSED_TIME};
    int[]to={R.id.row_name,R.id.row_chronometer};
    startList = new ArrayList(trackerList.size());
    lastPauseList = new ArrayList(trackerList.size());
    for (int i = 0; i onCreateLoader(int i, Bundle bundle) {
    return new TrackLoader(this,db);

    }
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    public void onLoadFinished(Loader loader, Cursor cursor) {
    myAdapter.swapCursor(cursor);
    }
    @Override
    public void onLoaderReset(Loader loader) {

    }

    static class TrackLoader extends CursorLoader {
    SQLiteDatabase db;
    public TrackLoader(Context context,SQLiteDatabase db){
    super(context);
    this.db = db;
    }
    @Override
    public Cursor loadInBackground() {
    return Tracker.getAll(db);
    }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    for (int i = 0; i 1000){
    outState.putLong("elapsedTime " + i, elapsed.get(i));
    }
    outState.putLong("base "+i,basesList.get(i));
    outState.putLong("lastPause "+i,lastPauseList.get(i));
    outState.putBoolean("start " + i, startList.get(i));

    Log.d("myTag", "OnSavedInstanceState-----------------------------------------");
    Log.d("myTag", "position " + i);
    Log.d("myTag", "elapsedTime " + getTime(outState.getLong("elapsedTime "+i)));
    Log.d("myTag", "base "+ getTime(outState.getLong("base "+i)));
    Log.d("myTag", "lastPause "+ getTime(outState.getLong("lastPause "+i)));
    Log.d("myTag", "start "+ outState.getBoolean("start " + i));
    Log.d("myTag","------------------------------------------end onSavedInstanceState");
    }

    }
    String getTime(long time){
    int hours = (int)(time/3600000);
    int minutes = (int)(time -hours*3600000)/60000;
    int seconds = (int)(time-hours*3600000-minutes*60000)/1000;
    String hour = (hours<9?"0"+hours:hours).toString();
    String min = (minutes<9?"0"+minutes:minutes).toString();
    String sec = (seconds<9?"0"+seconds:seconds).toString();
    return ""+hour+":"+min+":"+sec;
    }

    public class MyAdapter extends SimpleCursorAdapter{

    Context context;
    int resorceID;

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public MyAdapter(Context context,int resourceID,Cursor c,String[] from,int[]to,int flags){
    super(context,resourceID,c,from,to,flags);
    this.context=context;
    this.resorceID =resourceID;
    elapsed = new ArrayList(trackerList.size());
    basesList = new ArrayList(trackerList.size());
    for (int i = 0; i elapsed.get(position))//если время, полученое после поворота больше, которое насчитает в onTick, запишется в список, но такого никогда не будет
    elapsed.set(position, elapsedTime);
    if(startList.get(position)==bundleIsItStart)//по аналогии как выше, если если текущий элемент == статусу, пишем в список статус, иначе элемент остается в списке
    startList.set(position,bundleIsItStart);
    if(lastPauseList.get(position)>lastPause[0])
    lastPauseList.set(position,lastPause[0]);

    /* if(bundleIsItStart){
    holder.stop.setEnabled(true);
    holder.start.setEnabled(false);
    holder.chronometer.setBase(base);
    holder.chronometer.start();
    }*/
    /* if(!bundleIsItStart && base>1000){
    holder.chronometer.setBase(base+(SystemClock.elapsedRealtime()-base+lastPause[0]));
    holder.stop.setEnabled(false);
    holder.start.setEnabled(true);
    }*/

    }else{

    holder.name.setText(tracker.getName());
    holder.start.setEnabled(true);
    holder.stop.setEnabled(false);
    }
    holder.start.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    finalHolder.chronometer.setBase(SystemClock.elapsedRealtime() + lastPause[0]);
    finalHolder.chronometer.start();
    finalHolder.stop.setEnabled(true);
    finalHolder.start.setEnabled(false);
    basesList.set(position, finalHolder.chronometer.getBase());
    startList.set(position,true);
    }
    });
    holder.stop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    lastPause[0]=finalHolder.chronometer.getBase()-SystemClock.elapsedRealtime();
    finalHolder.chronometer.stop();
    finalHolder.start.setEnabled(true);
    finalHolder.stop.setEnabled(false);
    lastPauseList.set(position,lastPause[0]);
    startList.set(position,false);
    }
    });
    holder.chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
    @Override
    public void onChronometerTick(Chronometer chronometer) {
    elapsed.set(position, SystemClock.elapsedRealtime() - finalHolder.chronometer.getBase());
    Log.d("myTag", "elapsedTime = " + getTime(elapsed.get(position)) + " position = " + position);
    }
    });
    }

    return row;
    }
    String getTime(long time){
    int hours = (int)(time/3600000);
    int minutes = (int)(time -hours*3600000)/60000;
    int seconds = (int)(time-hours*3600000-minutes*60000)/1000;
    String hour = (hours<9?"0"+hours:hours).toString();
    String min = (minutes<9?"0"+minutes:minutes).toString();
    String sec = (seconds<9?"0"+seconds:seconds).toString();
    return ""+hour+":"+min+":"+sec;
    }
    class TrackHolder{
    TextView name;
    Chronometer chronometer;
    Button start,stop;
    }
    }

    }
  • Как реализовать сохранения таймеров при повороте экрана?

    @dandewine Автор вопроса
    В следующем комментарии я кину весь код класса (в вопросе 10К ограничение) я все переписал, проблем с сохранением данных нет, с этим все стабильно, я там закомментировал два условие после которых я начинаются проблемы, начинается лже-отсчет времени первой позиции.
  • Как реализовать сохранения таймеров при повороте экрана?

    @dandewine Автор вопроса
    Что бы подробно описать проблему, 10к символов не хватило. Логи сюда не влезли.
  • Что быстрее, обновление информации в БД или удаление и запись?

    @dandewine Автор вопроса
    Большое спасибо, очень развернутый ответ)
    ссылки прочитал, полезная информация!