2016-03-20 8 views
1

私はこれで新しく、別のファイルからAsyncTaskを実行する関数を呼び出す必要があります。AsyncTaskはどうやって入ってくるのですかdoInBackgroundは実行されませんが、二回目は実行されます

MainActivity.javaコード

public class MainActivity extends AppCompatActivity { 
String res; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Asynctasktest newAsy = new Asynctasktest(); 



    res = newAsy.ValidateUser(); 

    Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show(); 
} 

} 

とAsyncTaskTest.javaコード

public class Asynctasktest extends MainActivity { 

String Res; 

private class GetFWork extends AsyncTask<Void,Void,String> { 

    @Override 
    protected void onPreExecute() { 
     Res = "onPreExecute"; 
    } 

    @Override 
    protected String doInBackground(Void... param) { 

     return "am i here"; 
    } 

    @Override 
    protected void onPostExecute(String Result) { 
     super.onPostExecute(Result); 
     Res = Result; 
    } 
} 

public String ValidateUser(){ 

    final GetFWork Fl = new GetFWork(); 

    Fl.execute(); 

    return Res; 
} 


} 

だから私はその上で示した、 "私はここにいる" が、私は "onPreExecute" を取得したテキストを取得する必要がありますまずはdoInBackgroundを実行しないでください。

+0

これはあなたのアプリでの出来事を追跡する非常に基本的な方法です。 'Log'を使うか、単にブレークポイントでデバッグしてください。 – Vucko

+0

最初の呼び出しはdoInBackground(..) 'をヒットする必要があります。 'doInBackground(..)'の先頭に 'android.os.Debug.waitForDebugger();'を追加し、ブレークポイントを入れて関数にヒットするかどうか確認してください。 –

+0

AsyncTaskの目的は、それが「非同期」であることです。それを実行()することはできず、次のコード行の中に結果があることを期待します。 – Egor

答えて

1

これは、AsyncTaskの動作方法です。

res = newAsy.ValidateUser(); 
Toast.makeText(getBaseContext(), "'"+res+"'", Toast.LENGTH_LONG).show(); 

両方同時に実行され、従ってれる - AsyncTaskは非同期であるので - RESの値は、依然として「onPreExecute」です。

0

Wukash製の良い点。ちょうど精巧にする。 ValidateUser()がResを返すとき、AsyncTaskが非同期で実行され、メインスレッドから実行されるという保証はありません。したがって、あなたのケースでは、Resが更新されていないので、nullを返します。

resultの値を返す必要がある場合は、ハンドラ関数のリファレンスをコールバックとして送信して、この作業を行います。

さらに詳しい説明が必要な場合は教えてください。私が最初にAysncTaskを実装していたときに同様の質問をしたことを思い出します。あなたが持っているアプローチので

Cannot execute task: the task has already been executed (a task can be executed only once) 

+0

コールバックを設定するためのリソースがたくさんあります。 [これは私が従った良いものです](http://stackoverflow.com/questions/9963691/android-asynctask-sending-callbacks-to-ui)。 –

+0

私はその例を使ってテストに取り組みました。だから私はPHPに別の呼び出しを行うためにAsynctaskを使用する必要があります、私はいくつかのパラメータを渡す必要がありますし、OnPreExecuteのように私はリンクを構築し、doInBackgroundで私はhttpurlconnection呼び出しを行い、答えを待っています。それとも良い方法がありますか? –

+0

@IvarsAkmentins私はあなたがそこにかなり良いと思う。おそらくそれが同期して行われる必要はないので、リンクビルドをdoInBackgroundに移動することもできます。適切なOOPのアプローチは、 'Asynctasktest'オブジェクトをインスタンス化し、リンク構築に必要な一連のパラメータを初期化し、すべてをdoInBackgroundにオフロードすることです。これは非常にしっかりとしたデザインになります。 –

0

はまた、あなたが二度同じAsyncTaskオブジェクトを呼び出すことはできませんか、このエラーが発生しますことを覚えておいてください

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    Res = "onPreExecute"; 
} 

この方法では、スーパーを呼び出して試してみてください新しいGetFWork()メソッドを作成するValidateUser()メソッドが有効です。

関連する問題