1

Myactivityには inner が含まれており、private class基本的には次のように見えますが、問題は次のとおりです。

public class MyActivity extends Activity
{
    // My xmlData that I want to fill in the asynchronous task
    XMLData xmlData;

    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        GetXMLTask task = new GetXMLTask(this);
        task.execute(url);

        if(xmlData == null) System.out.print("problem");
        // Prints "problem" : my xmlData is null, why?
    }

    private class GetXMLTask extends AsyncTask<String, Void, Void>
    {
        public GetXMLTask(Activity context)
        {
            // Constructor
        }

        protected Void doInBackground(String... params)
        {
            // Here some stuff to get and parse my XML
            xmlData = new XMLData(list);
            System.out.print(xmlData.list.size());
            // this line shows that I correctly fill my xmlData object
        }
    }
}

問題は、内部非同期クラスへの呼び出し後、xmlData 値が null であり、その理由がわかりません。私もこれを試しましたGetXMLTask

MyActivity.this.xmlData = new XMLData(list);

うまくいきませんが、なぜですか?私は何を間違っていますか?ご協力いただきありがとうございます。

4

4 に答える 4

8

非同期タスクは別のスレッドで発生します。元のスレッドはすぐに続行されます。したがって、xmlData 変数は将来の不明な時点まで更新されず、すぐには準備ができません。

于 2013-03-19T20:04:36.480 に答える
4

Gabe が回答で指摘したように、タスクが完了するまで利用できません。このため、onPostExeccute(). 取得したデータを、データで必要なことを行う場所に渡すdoInBackground()onPostExecute()、メインの関数に送信しますActivity

于 2013-03-19T20:09:57.223 に答える
2

doInBackGroundで値を返し、UIスレッドをブロックせずにスムーズに実行するためにonPostExecuteでキャッチします。また、Asycnタスクオブジェクトでget()メソッドを呼び出すこともできますが、これによりUIがブロックされます。

于 2013-03-19T20:10:41.487 に答える
1

XML データの作成にかなりの時間がかかる場合は、最初に空の XMLData オブジェクトを作成し、それを AsyncTask のバックグラウンド部分に入力してから、on Finish メソッドでアクションを続行できます。この方法では、ロードはバックグラウンド スレッドで行われますが、ロード後のアクションは UI スレッドで実行できます。

于 2013-03-19T20:13:12.120 に答える