1

doInBackground非同期タスクで計算された値を取得する方法を見つけるために、私は一日中研究を続けてきました。まったく運がありません。

基本的な HttpURLConnection リクエストを実行し、DOM を使用して Web ページから XML データを解析しています。データを2つの異なる配列に正常に保存しました

///////////inside doInBackground:
for(int x=0; x<10; x++)
{
    username[x] = element.getFirstChild().getNodeValue();
    score[x] = anotherElement.getFirstChild().getNodeValue();
}

ここでやりたいことは、単純に値を textView に出力することだけです。

他の多くのことの中で、私は試みました:

protected void onPostExecute(String result) 
{
        for (int xx = 0; xx<10; xx++)
        {
            theMainTextView.append(username[xx] + " scored " + score[xx] +"\n");
        }               
}

私が試みたものは何もありません。私が受け取っている定期的なエラーはNullPointerException. 私は劇的に間違ったことをしていますか?私が試すことができる他の(あいまいな)方法を知っていますか?それが役立つ場合は for ループを無視してください...私は多くのコードを省略しました。ユーザー名とスコアの 2 つの値を取得したいとします。

編集:おそらく、でAsyncTask終わることに言及する必要がありますreturn null;

編集:明らかにコードに問題はありませんが、グローバルに宣言されたボタンがあり、null ポインター例外が発生していました。申し訳ありません。

4

3 に答える 3

0

AsyncTask から値を取得するには、リスナーを使用できます。

最初にインターフェイス リスナ (新しいファイル) を作成します。

public interface AsyncListener {

        void onAsyncFinishMethod(String params);
}

次に、implement非同期タスクを呼び出すメイン クラスに使用します (例)。

public class MainActivity implements AsyncListener {

3 番目に、メイン クラスでリスナー メソッドの完全なボディを作成します。インターフェイスからメソッドをオーバーライドしています。したがって、パラメーターを変更する場合は、インターフェイスでも変更する必要があります。ここでは、タスクの終了後にすべての結果を取得し、onPostExecute を呼び出します。

@Override
public void onAsyncFinishMethod(String params) {
    Log.d("xxx", params);
}

4 番目に、非同期タスクのリスナーを設定します。つまり、非同期タスク クラスでこのメソッドを作成します。

public void setOnAsyncFinishedMethod(AsyncListener listener) {
    this.listener = listener;
}

非同期タスクに、そのリスナー タイプのプライベート パラメータがあることを確認してください

private AsyncListener listener;

非同期タスク クラスの onPostExecute では、最後にリスナー メソッドを呼び出します (このメソッドがない場合は作成してください)。

@Override
protected void onPostExecute(String params) {
    listener.onAsyncFinishMethod(param);
}

最後のステップ。メイン クラスで非同期タスクを呼び出すときに、setOnAsyncFinishedMethod メソッドをバインドすることを忘れないでください。

私の例:

private void runMyAsyncTask() {
    CustomAsync async = new CustomAsync();
    async.setOnAsyncFinishedMethod(this);//<<< before execute use setOnAsyncFinishedMethod
    thread.execute();
}

もちろん、onAsyncFinishedMethod で使用されるパラメーターは、onPostExecute とは異なる可能性があります。

于 2013-05-21T08:22:23.650 に答える