Согласно Android doco, вы должны запустить AsyncTask из потока пользовательского интерфейса, но на самом деле это зависит от того, кто запускает эту строку в AsyncTask.class первым:
private static final InternalHandler sHandler = new InternalHandler();
Если у вас есть AsyncTask, который вызывается как из пользовательского интерфейса, так и из рабочего потока, вы можете обойти это ограничение, вызвав его сначала из потока пользовательского интерфейса. Если вы нажмете это первым из вашей рабочей нити, вы обречены.
Я бы предпочел не полагаться на это, поскольку детали реализации могут измениться в любое время, но эти знания полезны, если вы, как и я, задаетесь вопросом «почему мой другой AsyncTask работает».