2017-07-27 2 views
0

これは私がAndroidのAsyncTaskを実装したいと思っている私の活動のコードスニペットです。 doInBackgroundの返信文をonPostExecuteにキャッチ/リトリーブすることが間違っている場合は教えてください。これが正しい場合はどうすればいいですか?AsyncTaskのdoInBackgroundメソッドからreturn文を取得していますか?

public class EvaluateTask extends AsyncTask{ 

    ProgressDialog progress = new ProgressDialog(context); 

    @Override 
    protected void onPreExecute() { 

     progress.setMessage("Analysing"); 
     progress.setIndeterminate(true); 
     progress.show(); 
    } 

    @Override 
    protected Object doInBackground(Object[] params) { 
     Evaluate evaluate = new Evaluate(db); //Evaluate class object 
     return evaluate.getScore(); 
    } 

    @Override 
    protected void onPostExecute(Object o) { 
     progress.dismiss(); 
     Intent i = new Intent(googleAct.this,result.class); 
     startActivity(i); 

     //ERROR IN FOLLOWING LINE >>>>>>> 
     i.putExtra("score",finalScore); 

    } 
} 

私はAsyncTaskを使用してバックグラウンドで(score変数を返す)getScore()メソッドの実行によりresult活動にEvaluateクラスからscore変数を転送することをここで注意してください。

+0

ストア変数のクラスのタイプは何ですか。また、あなたが余分に入れているエラーは何ですか。どこでもfinalscoreとして宣言された変数がないので、エラーが発生します。あなたのオブジェクトを利用してみてください。 –

+0

'AsyncTask'についてもっと学ぶ必要があります。クラスを拡張するときに型パラメータがいくつかありますが、doInbackground()の戻り値はonPostexecute()のパラメータとして渡されるべきです。 'onPostExecute(Object o)'のパラメータ 'Object o'の値 – Yazan

答えて

0

はい、AsyncTaskのクラス文を正しく書き込むと、onPostExecute()のdoInBackground()からreturn文を取得/キャッチできます。

AsyncTaskは、3つのクラス型(非プリミティブ)パラメータを受け入れる汎用クラスです。 doInBackground()メソッドから返された値を理解して取得するには、以下のコードを試してください。

EvaluateクラスのgetScore()メソッドの戻り値の型がintであると予想しています。

public class EvaluateTask extends AsyncTask<Void,Void,Integer> { 

ProgressDialog progress = new ProgressDialog(context); 


@Override 
protected void onPreExecute() { 

    progress.setMessage("Analysing"); 
    progress.setIndeterminate(true); 
    progress.show(); 
} 

@Override 
protected Integer doInBackground(Void... params) { 
    Evaluate evaluate = new Evaluate(db); //Evaluate class object 
    return evaluate.getScore(); 
} 

@Override 
protected void onPostExecute(Integer finalScore) { 

    // in this method, parameter "finalScore" is the returned value from doInBackground() method, that you can use now. 
    super.onPostExecute(finalScore); 
    progress.dismiss(); 
    Intent i = new Intent(googleAct.this, result.class); 
    startActivity(i); 

    //I am considering you were expecting below finalScore as the returned value from doInBackground() method. 
    //Now there should not be an error. 
    i.putExtra("score", finalScore); 
} 
} 
+0

こんにちは@Manishoaham、これはまだこの行にエラーを表示しています:' super.onPostExecute(integer); //整数単語 '@larryのエラー。 ANDはい、 'getScore()'は整数型を返します。 –

+0

実際、私は変数 "integer"を使って "finalScore"に編集しましたので、この行で同じものを編集するのを忘れてしまいました。それを "finalScore"に変更すると正常に動作します。また、もしあなたが助けられたら、答えを投票することもできます。 :) – Manishoaham

+0

他の人が正しいコードを直接コピーできるように私が行った編集を見直してください。私は正しいコード要件に従って、 'super.onPostExecute'メソッドで' final'を 'final'に変更しました。 –

1

あなたがAsyncTaskを拡張する場合は、あなたが一般的なの一環として、戻り値のデータの型を指定する必要があります。この例では

public class EvaluateTask extends AsyncTask<DbData, Void, String> 

、私はあなたが使用しているものを表現するためにDbDataを使用していますdoInBackground()を使用してデータを取得/評価します。dbこれは適切に入力し、タスクとしてパラメータとして渡す必要があります。返信するscoreの値がStringであると仮定しています。 オブジェクトをタイプに変更することができます(つまり、intの場合はIntegerを使用します)。あなたはdoInBackgroundから返すものは何でも

あなたはdoInBackgroundから返された私の例では、それはscoreStringなり、onPostExecuteに引数として提供されます。

+0

申し訳ありません@Larryしかし、これは正しく動作していないようです! –

+0

あなたはあなたが行った変更やあなたが見ていることについてより多くの情報を提供する必要があります。 –

+0

懸念をお寄せいただきありがとうございますが、上記の@Manishoahamの回答は編集後に問題なく機能します。あなたの答えの問題は、 'super.onPostExecute(finalScore)'メソッドの省略だったと思います。 –

関連する問題