Как только пользователь начнет печатать, запустите фоновый поток (BT
) и передайте text
ваших edit text
через Message
на BT
. После каждых 2 секунд пинг (отправка message
) на ваш Main Thread
с BT
. Получив message
в MainThread
, передайте message
, содержащий text
в вашем edit text
, на ваш BT
. Получив message
в BT
, просто сравните text
только что полученный с previous text passed
в BT
. Если оба texts
одинаковы, пользователь не печатает. Но пользователь может начать печатать снова в любой момент, поэтому продолжайте играть в эту игру в фоновом режиме, пока сообщение не станет живым (ни отправлено, ни удалено). Как только закончится жизнь сообщения, убейте BT
.
Редактируйте пример кода
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private boolean killThread = false;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editText);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if (hasFocus) {
Log.d(TAG, "onFocusChange: gained focus");
startThread(new WeakReference<MainActivity>(MainActivity.this));
}
}
});
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// for simplicity killing thread here
killThread = true;
}
});
}
private void startThread(final WeakReference<MainActivity> activityWeakReference) {
new Thread(new Runnable() {
String savedText = "";
@Override
public void run() {
do {
MainActivity activity = activityWeakReference.get();
if (null == activity) {
// Activity destroyed, killME!!!
killThread = true;
Log.e(TAG, "run: activity reference null, killing MYSELF??");
} else {
if (savedText.equals(activity.editText.getText().toString())) {
Log.e(TAG, "run: user is not typing");
} else {
savedText = activity.editText.getText().toString();
Log.e(TAG, "run: user typing ");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} while (!killThread);
}
}).start();
}
}
Когда EditText
получает фокус, я запускаю тему (прохождениеWeakReference
до Activity
), а затем с помощью WeakReference
захватывает EditText
и проверяет его Text
. Для простоты я просто убиваю Thread
на Button Click
.