9

Ok so now I have Class A that contains some spinners that values will be populated by Class B that extends AsnycTask which grabs the spinner values from a web service. In class B i manage to retrieve the values, showing in a Toast. The problem now is how do I pass those spinner values back to Class A?

I've tried

Can OnPostExcecute method in AsyncTask RETURN values?

by passing Class A to Class B and store the value in a public variable of Class A like below

@Override
protected void onPostExecute(String result)
{
  classA.classAvariable = result;
}

However whenever I try to read the classAvariable i always get a NullPointer Exception. Seems like the variable was never assigned with the result. For readability purpose I needed to seperate Class B instead of using as an inline class.

Any ideas my fellow Java programmers?

4

4 に答える 4

33

設定される前にクラスA変数を読み取ろうとしていると思います。コールバック関数でコールバックを使用して読み取ってみてください。値を渡し、スピナーを更新してください。

作成し、(コンストラクターで)interfaceに渡してからAsyncTask、でメソッドを呼び出すことができます。onPostExecute

例えば:

あなたのインターフェース:

public interface OnTaskCompleted{
    void onTaskCompleted(values);
}

あなたの活動:

public YourActivity implements OnTaskCompleted{
    //your Activity
    YourTask  task = new YourTask(this); // here is the initalization code for your asyncTask
}

そしてあなたのAsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted(values);
    }
}
于 2012-12-11T08:00:17.480 に答える
1

ここでの問題は、AsynchTask を実行すると、その doInBackground() メソッドが別のスレッドで実行され、この AsynchTask を開始したスレッドが前方に移動することです。これにより、AsynchTask によって変数に変更が加えられても、親スレッドには反映されません (この AsynchTask を述べた人)。すぐに。

例 -

class MyAsynchTask
{

doInbackground()
{
a = 2;
}

}


int a = 5;

new MyAsynchTask().execute();

// ここではまだ 5 です

于 2012-12-11T09:23:00.877 に答える
0

次のようなインターフェイスを作成し、OnCompletRequest()これを ClassB コンストラクターに渡し、次のメソッドのように、このインターフェイス内のメソッドを呼び出すだけですcomplete(yourList list)onPostExecute(String result)

于 2012-12-11T08:02:42.220 に答える