I am trying to learn about doing background tasks on Android/Java by using threading. I made a simple test application which purely did a new Thread(new Runnable()) and did sleeps inside the runnable. When this was running, I was still able to click on buttons on my UI (I could see the visual feedback).
Happy this was working, I moved the same code into my main application codebase, but it seems like it is still running on the UI Thread as the GUI locks up and the ANR pops up after the sleep loop is completed.
Can anybody please help me work out why my backgroundThread is not running on a Background or Worker thread?
LoginService.java
package com.example.services;
import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class LoginService implements ILoginService {
private Handler handler;
public LoginService() {
handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
// Handle a message from the background task
Log.d("LoginService","Received a Message");
}
};
}
/*
Check if the username exists in the list
*/
@Override
public boolean isUsernameValid(String username) {
Log.d("LoginService","Starting Runnable");
Thread backgroundThread = new Thread(new LoginRunnable(this));
backgroundThread.run();
Log.d("LoginService", "Started Runnable");
return true;
}
/*
Check if the password is correct for the downloaded user
*/
@Override
public boolean doesPasswordMatch(String password) {
return false;
}
@Override
public void handleStatus(int i) {
switch (i) {
case 1:
Message newMessage = handler.obtainMessage();
newMessage.sendToTarget();
break;
default:
break;
}
}
}
LoginRunnable.java
package com.example.services;
import android.util.Log;
public class LoginRunnable implements Runnable {
public ILoginService loginService;
public LoginRunnable(ILoginService loginService)
{
this.loginService = loginService;
}
@Override
public void run() {
// Do the login tasks here
try {
for(int i = 0;i<=50;i++) {
Thread.sleep(200);
Log.d("LoginRunnable","200ms has passed");
loginService.handleStatus(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
// Return some completion message to the LoginService.
}
}
Output from App
11-08 18:06:36.757 11722-11722/com.example D/LoginService﹕ Starting Runnable
11-08 18:06:36.971 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.181 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.391 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.601 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:37.811 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.021 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.231 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.441 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.652 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:38.861 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.072 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.282 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.492 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.701 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:39.912 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.121 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.332 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.542 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.752 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:40.962 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.172 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.381 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.592 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:41.802 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.012 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.222 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.432 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.642 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:42.851 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.062 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.272 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.482 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.692 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:43.902 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.112 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.322 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.532 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.741 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:44.952 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.162 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.372 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.582 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:45.792 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.002 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.212 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.422 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.632 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:46.842 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.052 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.262 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.472 11722-11722/com.example D/LoginRunnable﹕ 200ms has passed
11-08 18:06:47.472 11722-11722/com.example D/LoginService﹕ Started Runnable
11-08 18:06:47.482 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.482 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.483 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.484 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.485 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.486 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.487 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.487 11722-11722/com.example D/LoginService﹕ Received a Message
11-08 18:06:47.487 11722-11722/com.example D/LoginService﹕ Received a Message
Output from Working Test Program (Seperate Project)
11-08 17:57:31.284 32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.284 32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:31.493 32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.494 32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:31.704 32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.704 32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:31.914 32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:31.914 32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:32.123 32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:32.124 32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
11-08 17:57:32.334 32596-32610/com.subarudev.threadingtest D/SleepRunnable﹕ Sleeping on thread
11-08 17:57:32.334 32596-32596/com.subarudev.threadingtest D/MainActivity﹕ Handle Message
backgroundThread.run() - > backgroundThread.start()?