2012年2月15日の時点では、これがうまく機能しない理由や理由がまだわかりません。ソリューションに最も近いのは、従来のスレッドアプローチを使用することですが、なぜAndroid SDKで機能しない(と思われる)クラスを含めるのでしょうか。
Evenin 'SO!
私はAsyncTaskサブクラスを持っています:
// ParseListener had a callback which was called when an item was parsed in a
// RSS-xml, but as stated further down it is not used at all right now.
private class xmlAsync extends AsyncTask<String, RSSItem, Void> implements ParseListener
これは次のように実行されます。
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
今、このサブクラスは小さなエラーに遭遇しました。以前はいくつかのxml解析を行いましたが、doInBackground()が呼び出されていないことに気付いたときは、行ごとに削除し、最終的には次のようになりました。
@Override
protected Void doInBackground(String... params) 
{
    Log.v(TAG, "doInBackground");
        return null;
}
これは、何らかの理由で何も記録しませんでした。しかし、私はこれを追加しました:
@Override
protected void onPreExecute() 
{
        Log.v(TAG, "onPreExecute");
        super.onPreExecute();
}
スレッドを実行すると、その行は実際にログに記録されます。したがって、どういうわけかonPreExecute()が呼び出されますが、doInBackground()は呼び出されません。別のAsyncTaskを同時にバックグラウンドで実行していますが、これは問題なく動作します。
私は現在、北極に近いエミュレーター、SDKバージョン15、Eclipse、Mac OS X 10.7.2でアプリを実行しています。
編集:
@Override
    protected void onProgressUpdate(RSSItem... values) {
        if(values[0] == null)
        {
                            // activity function which merely creates a dialog
            showInputError();
        }
        else
        {
            Log.v(TAG, "adding "+values[0].toString());
            _tableManager.addRSSItem(values[0]);
        }
        super.onProgressUpdate(values);
    }
_tableManager.addRSSItem()は、アクティビティのコンテキストで初期化されたSQLiteDatabaseに多かれ少なかれ行を追加します。publishProgress()は、インターフェースParseListenerのコールバックによって呼び出されます。しかし、doInBackground()でlog.v以外は何もしなかったので、最初にこれを起動する必要もないことに気付きました。
編集2:
さて、完全に明確にするために、これはもう1つのAsyncTaskであり、同じアクティビティで実行され、完全に正常に動作します。
private class dbAsync extends AsyncTask<Void, RSSItem, Void>
{
    Integer prevCount;
    boolean run;
    @Override
    protected void onPreExecute() {
        run = true;
        super.onPreExecute();
    }
    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        run = true;
        prevCount = 0;
        while(run)
        {
            ArrayList<RSSItem> items = _tableManager.getAllItems();
            if(items != null)
            {
                if(items.size() > prevCount)
                {
                    Log.v("db Thread", "Found new item(s)!");
                    prevCount = items.size();
                    RSSItem[] itemsArray = new RSSItem[items.size()];
                    publishProgress(items.toArray(itemsArray));
                }
            }               
            SystemClock.sleep(5000);
        }
        return null;
    }
    @Override
    protected void onProgressUpdate(RSSItem... values) {
        ArrayList<RSSItem> list = new ArrayList<RSSItem>();
        for(int i = 0; i < values.length; i++)
        {
            list.add(i, values[i]);
        }
        setItemsAndUpdateList(list);
        super.onProgressUpdate(values);
    }
    @Override
    protected void onCancelled() {
        run = false;
        super.onCancelled();
    }
}
編集3:
ため息、ごめんなさい。しかし、これがタスクの初期化です。
xmlAsync _xmlParseThread;
dbAsync _dbLookup;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_dbLookup = new dbAsync();
_dbLookup.execute();
_xmlParseThread = new xmlAsync();       
_xmlParseThread.execute("http://www.nothing.com", null);
}