I had a similar problem. The problem i had was in JUnit tests, which
run in non-UI threads, causing AsyncTasks to be loaded in non-UI
threads and i got the same error message. However, as long as you
create your process' first AsyncTask in a UI-thread, all next ones can
be created in non-UI threads.
This is what i did in my JUnit tests:
First some 'static' code calls this method below as soon as possible,
which creates a dummy AsyncTask that is never executed. It just makes
sure that the Looper for every AsyncTask is created in a UI-thread.
public static synchronized void initialize(Instrumentation inst) {
if (hasBeenInitialized)
return;
// Just to load AsyncTask in the main UI thread....
// If the first AsyncTask instance is loaded in any other thread, UI-
callbacks will never work.
inst.runOnMainSync(new Runnable() {
public void run() {
Object dummy = new AsyncTask<Void,Void,Void>() {
protected Void
doInBackground(Void... params) { return null; } };
}
});
hasBeenInitialized = true;
}
After this method has been called, AsyncTasks can be created from non-
UI threads.
If you don't deal with JUnit tests and such, just make sure that your
first (dummy) AsyncTask instance is created in a UI-thread (e.g
onCreate). All subsequent ones can be created in non-UI threads.
However, TreKing's comments about calling performTask when your
service starts is still very valid :-)
On Aug 9, 7:06 am, Samuh <[email protected]> wrote:
> I have a helper class that contains definition of an AsyncTask(inner
> class). Other classes instantiate this class and call one of its
> method which in turn instantiates, the AsyncTask and starts execution.
>
> class TaskManager{
>
> private class SomeTask extends AsyncTask<>{}
>
> public void performTask(){
> new SomeTask().execute();
>
> }
> }
>
> //usage: new TaskManager().performTask();
>
> I schedule Alarms which when triggered start a Service. When the
> service starts it creates a Runnable and enqueues it in the work
> queue. From this Runnable, I want to instantiate my helper class and
> start execution of the AsynTask.
>
> The problem is AsyncTask needs to be instantiated from main UI thread
> I am getting errors as soon as the spawned thread calls the method of
> the helper class. The exception is that AsyncTask cannot be called
> from a thread that hasnt called Looper.prepare().
>
> How do I avoid this?
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en