2

いくつかのデータを含むXMLファイルがあるので、それを表すクラスを作成しました。

public class MyData
{
    ArrayList<SpecialData> list;
    int currentPage, totalPages;
}

ご想像のとおり、アイテムのリストがありSpecialData、各アイテムには多くのフィールドが含まれており、currentPage/totalPagesはXMLファイル内の2つの一意の値です。XMLファイルを非同期で取得して解析する必要があるため、次のクラスを作成しました。

class GetXMLTask extends AsyncTask<String, Void, MyData>
{
    @Override
    protected MyData doInBackground(String... params)
    {
        MyData md = null;
        // Getting/parsing data
        return md;
    }
}

MyData試してみましたが、XMLファイルを正しく解析し、オブジェクトが完全であるため、ここから問題が発生することはありません。Activityしかし、それから私は私のメインクラスでこのようにこのタスクを使用します:

MyData md = null;
GetXMLTask task = new GetXMLTask(this);
task.execute(new String[]{url});
// How can this change my md object?

MyDataこれは非常にばかげているかもしれませんが、メインクラスから取得したインスタンスにインスタンスをリンクする方法がわかりませんAsyncTask。私は何をすべきか?ありがとう。

4

4 に答える 4

6

オーバーライドAsyncTaskonPostExecuteメソッド:

protected void onPostExecute(MyData result) {
     md = result;
 }

これは、AsyncTaskがアクティビティの内部クラスであることを前提としていることに注意してください。そうでない場合は、コンストラクター内のアクティビティへの参照をAsyncTaskに渡すことができます。WeakReferenceこのような場合、リソースリークを防ぐために、アクティビティにaを使用するように注意する必要があります。

GetXMLTask(MyActivity activity)
{
    this.mActivity = new WeakReference<MyActivity>(activity);
}

protected void onPostExecute(MyData result)
{
     MyActivity activity = this.mActivity.get();
     if (activity == null) // Activity was destroyed due to orientation change, etc.
         return;
     activity.updateUiFromXml(result);
 }
于 2013-03-19T17:22:56.440 に答える
2

おそらく、ある種のコールバックを実装したいと思うでしょう。このようにして、データを公開することでデータの公開を回避し、他のコールバック(データの読み込みに問題がある場合のエラーコールバックなど)を実装できます。

たとえば、次のようなインターフェイスを定義できます。

interface MyAsyncFinishedLister {
    void onFinished(MyData resultData);
}

AsyncTaskにはMyAsyncFinishedListenerのインスタンスがあり、次のようにonPostExecuteを呼び出すことができます。

protected void onPostExecute(MyData result) {
     myAsyncFinishedListener.onFinished(result);
}

主なアクティビティはこのインターフェースを実装し、次のようになります。

class MyActivity extends Activity implements MyAsyncFinishedListener {
    MyData md;

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

        GetXMLTask task = new GetXMLTask(this);
        task.execute(new String[]{url});
        task.setOnFinishedListener(this);
    }

    onFinished(MyData result) {
        md = result;
    }
}
于 2013-03-19T17:27:29.570 に答える
1

AsyncTaskがデータオブジェクトを返すようにする場合は、関数スコープではなく、クラススコープの変数に格納する必要があります。これを簡単にするために、タスクは通常、プライベート内部クラスです。

于 2013-03-19T17:21:57.857 に答える
1

クラス全体に表示さMyDataれる変数として宣言し、結果をMyData変数に割り当ててアクセスを試みます。onPostExecute()

于 2013-03-19T17:23:35.677 に答える