Android в основном работает на двух видах резьбы, а именно поток пользовательского интерфейса и фоновый поток. Согласно документации android -
Не обращайтесь к инструментарию Android UI из-за пределов пользовательского интерфейса, чтобы исправить эту проблему, Android предлагает несколько способов доступа к потоку пользовательского интерфейса из других потоков. Вот список методов, которые могут помочь:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Теперь существуют различные способы решения этой проблемы. Я объясню это на примере кода
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
LOOPER
Класс используется для запуска цикла обработки сообщений для потока. Потоки по умолчанию не имеют связанного с ними цикла сообщений; чтобы создать один, вызовите prepare() в потоке, который должен запустить цикл, а затем loop(), чтобы обработать сообщения до тех пор, пока цикл не будет остановлен.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
AsyncTask
AsyncTask позволяет выполнить асинхронную работу на пользовательском интерфейсе. Он выполняет операции блокировки в рабочем потоке, а затем публикует результаты в потоке пользовательского интерфейса, не требуя, чтобы вы сами обрабатывали потоки и/или обработчики.
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
Handler
обработчиком позволяет передавать и обрабатывать сообщения и Runnable объекты, связанные с MessageQueue потока.
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});
http: // stackoverflow.com/questions/4208730/how-to-detect-user-inactivity-in-android – Amar
И при переопределении public void inactivitydetected() Я использовал функцию тоста – Amar