Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Обновить список БД после добавление новой записи?

При добавление записи в таблицу она добавляется в ListView, а при нажатие на какую либо строку списка ID бд выводится в TextView . Проблема в том, что новая запись не выводит ID сразу после добавления и нажатия на нее.
А когда вручную поменяешь горизонтальное и вертикальное положение экрана она выбирается )))
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues contentValues = new ContentValues();
                contentValues.put("name",name.getText().toString());
                contentValues.put("phone",phone.getText().toString());
 
                sqLiteDatabase.insert("Contact",null,contentValues);
 
                massname.add(0, name.getText().toString()+" "+ phone.getText().toString());
                adapter.notifyDataSetChanged();
 
                Toast toast = Toast.makeText(getApplicationContext(),
                        "Запись добавлена", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                name.setText("");
 
            }
        });
Ответ: Василевский, по моему это нарушение MVC-патерна. Не нужно вручную добавлять элемент в ListView. Нужно добавить запись в модель(базу), а модель должна проинформировать представление(ListView) о том, что ему(представлению) нужно обновиться. Новые данные для ListView следует брать из базы, а не вставлять прямо из полей ввода.
Вопрос: Ошибка с записью объекта в ArrayList

Создал класс с конструктором
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Time_Table extends Activity {
 
String depart, arrived, date;
    int cost, id;
 
Time_Table(String _depart, String _arrived, String _date, int _cost, int _id)
{
    depart = _depart;
    arrived = _arrived;
    date = _date;
    cost = _cost;
    id = _id;
}
//Этот конструктор написал чисто для проверки возможной проблемы с int/Integer
//то есть оставил только прием строковых 
    Time_Table(String _depart, String _arrived)
    {
        depart = _depart;
        arrived = _arrived;
       ;
    }
}
Далее в другом классе создал лист:
Java
1
 ArrayList<Time_Table> time_tables = new ArrayList<Time_Table>();
После получаю данные с JSON и пытаюсь их записать:
Java
1
2
3
4
5
6
7
8
9
10
//Этот код выполняется в цикле и находится в try catch
String p_o_d = jo.getString("POINT_OF_DEPARTURE");
String destin = jo.getString("DESTINATION");
/*String date_ru = jo.getString("date_ru");
Integer cost =  jo.getInt("COST");
Integer id_f =  jo.getInt("ID_FLIGHT");*/
Log.i("chat", i+"."); //Здесь информация в логах выводится
time_tables.add(new Time_Table(p_o_d, destin));//вот здесь что-то не так но что я понять не могу
Log.i("chat", i+"."); //переместил лог сюда и он уже не появляется 
//таким образом ошибка связана со строчкой выше
Подскажите в чем может быть проблема...
Ответ: Паблито, спасибо за ответы, все работает.Еще такой вопрос: у меня есть три класса:t_table, List_Time_Table, and TimeAdapter. Суть в том, что в TimeAdapter я создал и настроил свой адаптер:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class TimeAdapter extends BaseAdapter {
 
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<Time_Table> objects;
 
    TimeAdapter(Context context, ArrayList<Time_Table> time_tabl) {
        Log.i("TimeAdapter", "Конструктор");
        ctx = context;
        objects = time_tabl;
        lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
 
    // кол-во элементов
    @Override
    public int getCount() {
        Log.i("TimeAdapter", "Количество элементов");
        return objects.size();
    }
 
    // элемент по позиции
    @Override
    public Object getItem(int position) {
        Log.i("TimeAdapter", "Элементо по позиции");
        return objects.get(position);
    }
 
    // id по позиции
    @Override
    public long getItemId(int position) {
        Log.i("TimeAdapter", "id по позиции");
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // используем созданные, но не используемые view
        Log.i("TimeAdapter", "public View getView");
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.list1, parent, false);
        }
        Log.i("TimeAdapter", "Time_Table p = getProduct");
         Time_Table p = getProduct(position);
 
        // заполняем View в пункте списка данными из товаров: наименование, цена
        // и картинка
        ((TextView) view.findViewById(R.id.dest)).setText(p.depart);
        ((TextView) view.findViewById(R.id.point_of_dest)).setText(p.arrived);
        ((TextView) view.findViewById(R.id.date)).setText(p.date);
        ((TextView) view.findViewById(R.id.cost)).setText(p.cost);
        ((TextView) view.findViewById(R.id.id_fly)).setText(p.id);
        Log.i("TimeAdapter", "заполняем View");
        return view;
    }
 
    // товар по позиции
    Time_Table getProduct(int position) {
        Log.i("TimeAdapter", "товар по позиции");
        return ((Time_Table) getItem(position));
    }
}
В List_Time_Table я создал ArrayList и заполнил его данными:
Java
1
2
3
4
5
6
public class List_Time_Table extends AsyncTask<Void, Void, Integer> {
    public ArrayList<Time_Table> time_tables = new ArrayList<Time_Table>();
 
................
 
time_tables.add(new Time_Table(p_o_d, destin, date_ru, cost, id_f));
далее в классе t_table мне нужно все это собрать в кучу чтобы вывести в ListViev(его id - list_view_tables):
Java
1
2
3
4
5
6
7
8
List_Time_Table list_time_table = new List_Time_Table();//здесь я получаю данные из JSON и заполняю ими список
        list_time_table.execute();
        adapter = new TimeAdapter(this, list_time_table.time_tables);//здесь я формирую адаптер и пытаюсь
//отправить в него свой список, как я понял из попыток все починить именно тут проблема
        
        // настраиваем список
        ListView lvMain = (ListView) findViewById(R.id.list_view_tables);
        lvMain.setAdapter(adapter);
Несмотря на все мои попытки список так и не материализовался
Возможно проблема в том, что я список формирую в одном классе, а использую его в другом, но вроде так можно... Или нельзя?
Вопрос: Как можно реализовать слушатель новых сообщений?

Здравствуйте!

Я хочу понять, как можно реализовать получение новых сообщений, даже когда приложение свернуто\закрыто?

Как в любом месседжере когда кто-то отправляет мне сообщение оно тут же приходит, добавляется в ListView и отображается, вот мне интересно как они так сделали это прослушивание новых сообщений?

Неужели у них бесконечный цикл, который с задержкой пару секунд посылает запрос на сервер на наличие новых сообщений?
Как это можно реализовать, например в VkApi, у кого-нибудь есть догадки?
Ответ:
Сообщение от sanchezsanya
вот мне интересно как они так сделали это прослушивание новых сообщений?
запущен сервис, который держит открытым соединение на сервер приложения

Сообщение от sanchezsanya
А его можно прикрутить с vk api?
не нужно писать еще один кривой и хромой недоделанный клиент для vk
вас хватает, пейсателей
Вопрос: Room. Не производится запись

Пишу простое тестовое приложение с использованием библиотеки Room.
Проблема: не получается произвести запись в таблицу. Приложение отрабатывает без ошибок, но запись в таблицу не происходит. Хотя сама база данных появляется, но без требуемой таблицы.

Подскажите где я не прав.

ЗЫ если приложение скомпилировано и запущено(база данных создана), а после этого в AppDatabase изменить версию на иную и вновь запустить приложение, то закономерно приложение вылетет с ошибкой, но при этом запись в таблицу произайдет.

MainActivity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class MainActivity extends AppCompatActivity {
 
    Button writeButton;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        writeButton = findViewById(R.id.btTestRoom);
        writeButton.setOnClickListener(oclc);
 
    }
 
    View.OnClickListener oclc = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
         
            Runnable run = new Runnable() {
                @Override
                public void run() {
 
                    PlaceDBE place = new PlaceDBE("1", "Varshava");
 
                    AppDatabase appDatabase = AppDatabase.getInstance(getApplication().getApplicationContext());
                    appDatabase.getPlaceDao().insert(place);
 
                }
            };
 
            Thread t = new Thread(run);
            t.start();
        }
    };
}
AppDatabase.class
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Database(entities = {PlaceDBE.class} , version = 1)
public abstract class AppDatabase extends RoomDatabase {
 
    public abstract PlaceDAO getPlaceDao();
 
    private static AppDatabase appDatabase;
 
    public static AppDatabase getInstance(Context context){
 
        if(appDatabase == null){
            appDatabase = Room.databaseBuilder(context,
                    AppDatabase.class,
                    "testdb")
            .build();
        }else {
            return appDatabase;
        }
 
        return appDatabase;
    }
 
}
PlaceDAO
Java
1
2
3
4
5
6
7
8
9
@Dao
public interface PlaceDAO {
 
    String TABLE_NAME = "place";
 
    @Insert(onConflict = OnConflictStrategy.REPLACE)
 
    void insert(PlaceDBE place);
}
PlaceDBE
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Entity(tableName = PlaceDAO.TABLE_NAME)
public class PlaceDBE {
 
 
    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "id")
    String id;
 
    @ColumnInfo(name = "place")
    String place;
 
    public PlaceDBE(@NonNull String id, String place) {
        this.id = id;
        this.place = place;
    }
 
    @NonNull
    public String getId() {
        return id;
    }
 
    public void setId(@NonNull String id) {
        this.id = id;
    }
 
    public String getPlace() {
        return place;
    }
 
    public void setPlace(String place) {
        this.place = place;
    }
}
Ответ: VASSUV, Вы не внимательно читали первый пост, я там писал что приложение отрабатывает без ошибок, а запись производится в отдельном потоке.

По ошибке, а точнее ее отсутствии. На самом деле все работает обсалютно правильно, просто при записи в дб в девайс файл эксплоере не происходило обновление размера файла дб(даже после ручного обновления папки), по этой причине я и решил что запись в дб не производится... Меня ввело в заблуждение то, что при изменении версии дб(без миграции дб) и последующего запуска программы с заканомерным вылетом, запись производилась и менялся размер файла.
Вопрос: Запустить новое активити из фотокамеры?

Заголовок получился фиговый.
Задача такая: выбрать изображение из галереи (нативного приложения Gallery) или снять на камеру. После этого показать эту картинку на новом экране с возможностью увеличения и уменьшения через мультитач и через кнопки зума (без использования WebView).
Я понимаю вот что: надо из моего приложения с помощью интента вызвать гелерею или камеру. предположим я это осилил и фотка у меня есть. Но что дальше делать?...
Ответ: YuraAAA, запутался окончательно. теперь новые ошибки наваял
Вопрос: Громкость записи звука

Как можно получить громкость звука с микрофона при записи? запись ведётся через следующий код:
Java
1
2
3
4
5
6
7
 mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mediaRecorder.setOutputFile(fileName);
            mediaRecorder.prepare();
            mediaRecorder.start();
Всем заранее спасибо!
Ответ: Нашёл решение. Громкость можно получить через mediaRecorder.getMaxAmplitude();
Перед этим необходимо начать запись
Вопрос: Вытащить информацию из SQLite на новое Activity

Здравствуйте!
У меня есть 3 класса:
В DB создаю базу данных, записи добавляются прямо из приложения.
В MainActivity по данным из базы создаю ListView, заполняемый с помощью CursorLoader.
По идее, в зависимости от выбранного объекта из ListView запускается новое activity, которое отображает данные из БД по этому объекту. За это должен отвечать третий класс - OneEvent.

Реализовать открытие нового activity у меня получилось, вопрос - как вытащить информацию БД на этот activity?

Коды классов:
MainActivity
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
 
import android.content.Context;
import android.database.Cursor;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
 
 
import java.util.concurrent.TimeUnit;
 
public class MainActivity extends AppCompatActivity implements LoaderCallbacks<Cursor> {
 
    private static final int CM_DELETE_ID = 1;
    ListView lvData;
    DB db;
    SimpleCursorAdapter scAdapter;
    final String LOG_TAG = "myLogs";
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        // открываем подключение к БД
        db = new DB(this);
        db.open();
 
        // формируем столбцы сопоставления
        String[] from = new String[] { DB.COLUMN_TITLE, DB.COLUMN_DATE, DB.COLUMN_TIME };
        int[] to = new int[] { R.id.tvTextTitle, R.id.tvTextDate, R.id.tvTextTime };
 
        // создаем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0);
        lvData = (ListView) findViewById(R.id.lvData);
        lvData.setAdapter(scAdapter);
 
        // добавляем контекстное меню к списку
        registerForContextMenu(lvData);
 
        // создаем лоадер для чтения данных
        getSupportLoaderManager().initLoader(0, null, this);
 
       lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
       //Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id);
 
             Intent myIntent = new Intent(MainActivity.this , OneEvent.class);
               startActivityForResult(myIntent, 0);
        }
         });
 
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        menu.add(0, 1, 0, "Добавить событие");
        return super.onCreateOptionsMenu(menu);
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        StringBuilder sb = new StringBuilder();
        //noinspection SimplifiableIfStatement
        sb.append("Item Menu");
        Intent intent = new Intent(this, AddEvent.class);
        startActivityForResult(intent, 1);
 
        return super.onOptionsItemSelected(item);
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data == null) {return;}
        String title = data.getStringExtra("title");
        String date = data.getStringExtra("date");
        String time = data.getStringExtra("time");
        db.addRec(title, date, time);
        getSupportLoaderManager().getLoader(0).forceLoad();
    }
 
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);
    }
 
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем из пункта контекстного меню данные по пункту списка
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            // извлекаем id записи и удаляем соответствующую запись в БД
            db.delRec(acmi.id);
            // получаем новый курсор с данными
            getSupportLoaderManager().getLoader(0).forceLoad();
            return true;
        }
        return super.onContextItemSelected(item);
    }
 
    protected void onDestroy() {
        super.onDestroy();
        // закрываем подключение при выходе
        db.close();
    }
 
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        return new MyCursorLoader(this, db);
    }
 
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        scAdapter.swapCursor(cursor);
    }
 
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
 
    }
 
    static class MyCursorLoader extends CursorLoader {
 
        DB db;
 
        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }
 
        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.getAllData();
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return cursor;
        }
 
    }
}
OneEvent
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package ru.startandroid.p000111testing;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
import android.view.View.OnClickListener;
/**
 * Created by F.Slowpoke on 03.04.2016.
 */
public class OneEvent extends Activity implements OnClickListener {
 
    TextView tvEventTitle, tvEventDate, tvEventTime;
    int id = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one_event);
    }
 
    @Override
    public void onClick(View v) {
    }
}
DB
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
/**
 * Created by F.Slowpoke on 02.04.2016.
 */
public class DB {
    private static final String DB_NAME = "mydb";
    private static final int DB_VERSION = 1;
    private static final String DB_TABLE = "mytab";
 
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_TITLE = "title";
    public static final String COLUMN_DATE = "date";
    public static final String COLUMN_TIME = "time";
 
    private static final String DB_CREATE =
            "create table " + DB_TABLE + "(" +
                    COLUMN_ID + " integer primary key autoincrement, " +
                    COLUMN_TITLE + " text, " +
                    COLUMN_DATE + " text, " +
                    COLUMN_TIME + " text" +
                    ");";
 
    private final Context mCtx;
 
 
    private DBHelper mDBHelper;
    private SQLiteDatabase mDB;
 
 
    public DB(Context ctx) {
        mCtx = ctx;
    }
 
    // открыть подключение
    public void open() {
        mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
        mDB = mDBHelper.getWritableDatabase();
    }
 
    // закрыть подключение
    public void close() {
        if (mDBHelper!=null) mDBHelper.close();
    }
 
    // получить все данные из таблицы DB_TABLE
    public Cursor getAllData() {
        return mDB.query(DB_TABLE, null, null, null, null, null, "_id DESC");
    }
 
    // добавить запись в DB_TABLE
    public void addRec(String tit, String dat, String tim) {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_TITLE, tit);
        cv.put(COLUMN_DATE, dat);
        cv.put(COLUMN_TIME, tim);
        mDB.insert(DB_TABLE, null, cv);
    }
 
    // удалить запись из DB_TABLE
    public void delRec(long id) {
        mDB.delete(DB_TABLE, COLUMN_ID + "=" + id, null);
    }
 
    // класс по созданию и управлению БД
    private class DBHelper extends SQLiteOpenHelper {
 
        public DBHelper(Context context, String name, CursorFactory factory,
                        int version) {
            super(context, name, factory, version);
        }
 
        // создаем и заполняем БД
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DB_CREATE);
 
            ContentValues cv = new ContentValues();
            for (int i = 1; i < 3; i++) {
                cv.put(COLUMN_TITLE, "sometext " + i);
                cv.put(COLUMN_DATE, "sometext " + i);
                cv.put(COLUMN_TIME, "sometext " + i);
                db.insert(DB_TABLE, null, cv);
            }
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}
Ответ: Огромное Вам спасибо, все получилось!
Вопрос: Чтение и запись xml файла на SD-карту

Мне нужно из БД сохранять определенную информацию в файл (это будет инфа пользователя), а потом загружать при необходимости. И таких файлов может быть несколько.
По отдельности я нашел эти действия. Запись файла на SD:
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    void writeFileSD() {
        // проверяем доступность SD
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            Log.d(LOG_TAG, "SD-карта не доступна: " + Environment.getExternalStorageState());
            return;
        }
        // получаем путь к SD
        File sdPath = Environment.getExternalStorageDirectory();
        // добавляем свой каталог к пути
        sdPath = new File(sdPath.getAbsolutePath() + "/" + DIR_SD);
        // создаем каталог
        sdPath.mkdirs();
        // формируем объект File, который содержит путь к файлу
        File sdFile = new File(sdPath, FILENAME_SD);
        try {
            // открываем поток для записи
            BufferedWriter bw = new BufferedWriter(new FileWriter(sdFile));
            // пишем данные
            bw.write("Содержимое файла на SD");
            // закрываем поток
            bw.close();
            Log.d(LOG_TAG, "Файл записан на SD: " + sdFile.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

чтение файла с SD:
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    void readFileSD() {
        // проверяем доступность SD
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            Log.d(LOG_TAG, "SD-карта не доступна: " + Environment.getExternalStorageState());
            return;
        }
        // получаем путь к SD
        File sdPath = Environment.getExternalStorageDirectory();
        // добавляем свой каталог к пути
        sdPath = new File(sdPath.getAbsolutePath() + "/" + DIR_SD);
        // формируем объект File, который содержит путь к файлу
        File sdFile = new File(sdPath, FILENAME_SD);
        try {
            // открываем поток для чтения
            BufferedReader br = new BufferedReader(new FileReader(sdFile));
            String str = "";
            // читаем содержимое
            while ((str = br.readLine()) != null) {
                Log.d(LOG_TAG, str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Парсинг xml файла находящегося в ресурсах (/res/xml/data.xml):
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class MainActivity extends Activity {
 
  final String LOG_TAG = "myLogs";
 
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String tmp = "";
 
    try {
      XmlPullParser xpp = prepareXpp();
 
      while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
        switch (xpp.getEventType()) {
        // начало документа
        case XmlPullParser.START_DOCUMENT:
          Log.d(LOG_TAG, "START_DOCUMENT");
          break;
        // начало тэга
        case XmlPullParser.START_TAG:
          Log.d(LOG_TAG, "START_TAG: name = " + xpp.getName()
              + ", depth = " + xpp.getDepth() + ", attrCount = "
              + xpp.getAttributeCount());
          tmp = "";
          for (int i = 0; i < xpp.getAttributeCount(); i++) {
            tmp = tmp + xpp.getAttributeName(i) + " = "
                + xpp.getAttributeValue(i) + ", ";
          }
          if (!TextUtils.isEmpty(tmp))
            Log.d(LOG_TAG, "Attributes: " + tmp);
          break;
        // конец тэга
        case XmlPullParser.END_TAG:
          Log.d(LOG_TAG, "END_TAG: name = " + xpp.getName());
          break;
        // содержимое тэга
        case XmlPullParser.TEXT:
          Log.d(LOG_TAG, "text = " + xpp.getText());
          break;
 
        default:
          break;
        }
        // следующий элемент
        xpp.next();
      }
      Log.d(LOG_TAG, "END_DOCUMENT");
 
    } catch (XmlPullParserException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 
  XmlPullParser prepareXpp() {
    return getResources().getXml(R.xml.data);
  }
}

А вот как соединить эти действия пока не понял.
Ответ:
C++
1
2
3
XmlPullParser prepareXpp() {
    return getResources().getXml(R.xml.data);
  }
похоже тут возвращается парсер, в у которого уже позвали метод setInput().
, java.lang.String)
Его можно и самостоятельно позвать. Добыть InputStream из файла думаю не составит труда.
вот тут есть пример:

правда там стригнридер используется. вот вместо него нужно InputStream от файла посетить.
Вопрос: Как слушать видео не выводя видео на экран

Как слушать видео (каламбур))
не выводя видео на экран?
Ответ:

пишут что как то умудрились это сделать
Now audio playback will continue in the background even when you’ve minimized MX Player or turned your smartphone screen off
Вопрос: Отложенное одноразовое действие по цилкическому таймеру

Возникла такая мысль для оптимизации:

есть флай-панелька (над всеми активити).
Ее можно двигать пальцем. Надо запоминать ее позицию.
Сделал свой реактор OnMove.
В нем пишу в базу позицию.
При частом движении получаю сотню записей/sql запросов (процессор взлетает до 100%), хотя хватило бы раз-два в секунду.

Хочу создавать некий класс-таймер который сработает через секунду. Причем "заказывать" событие можно много раз (подправляя данные для записи или даже без этого - сам получит), но сработает лишь раз. После срабатывания таймер можно "перезапустить". Надо управлять частотой срабатывания.

На моей памяти мне часто нужно было подобное, но не знал как.

Прежде чем городить велосипед, хотелось бы узнать - может такое УЖЕ есть? Как хотя-бы называется такая технология?
Ответ:
Цитата Сообщение от Паблито Посмотреть сообщение
я дальше не стал читать, ты уж извини
Не хочешь помогать - не засоряй ветку!

реактор Я писать должен! В "предке"! Я туда вписал только то чем реально пользуюсь. ВНЕШНИЙ реактор на отпускание мышки тоже могу приписать(создавать интерфейс, обрабатывать, назначать), но даже в этом случае мне он не нужен!

Мне нужно выполнять НЕ ЧАСТО обработку при самом движении, а не при отпускании!!!

И мне нужна ТЕХНОЛОГИЯ, а не частное решение!

Это лишь последний раз, когда я "споткнулся" на том что этого нет, а хотелось бы... Помню десяток случаев, когда идет килобайты почти одинакового мусора в логи, когда хотелось бы задавать "назойливость". Когда писал игрушку с бесконечным циклом и при каждом такте получал координаты машинки - не успевал поток текста читать - за секунду до 30-100 строк добавляло...