2017-01-24 6 views
-1

私はログインアクティビティを実装したいと思っています。 Webサービスとのユーザーの存在をチェックします。アンドロイドの結果を待つAsynTask

 EditText un=(EditText) findViewById(R.id.txtName); 
     EditText pass=(EditText) findViewById(R.id.txtPass); 
     WS ss=new WS(); 
     String str=ss.execute("checkLogin",un.getText().toString(),pass.getText().toString()).get(); 
     Intent in=new Intent(arg0.getContext(), Overview.class); 
     in.putExtra("username", str); 
     if(str=="No User") 
      Toast.makeText(getApplicationContext(), "ss", 300).show(); 
     else 
     { 
      startActivity(in); 
      finish(); 
     } 

"IF"セクションに問題があります。 "str"値は、コード行の終了後に設定されます。 しかし、私は "str"値を取得し、適切なアクションを実行するIFを確認したい。

+3

そのコードを 'AsyncTask'クラスの' onPostExecute'メソッドに置きます。 –

+0

WSクラスはseprateファイルにあります。 asyncTaskクラスのpostExecuteからアクティビティを開始する方法、またはedittextの値を変更する方法はありますか?出来ますか? –

+0

UIを更新するには、WSクラスを新しいファイルで作成するのではなく、内部クラスにします。この方法で、フラグメントまたはAppCompatActivityを拡張する外部クラスのパブリック変数にアクセスできます。 –

答えて

0

非同期タスクの全体的なポイントは、同期してブロックしないことです。あなたは、同期動作を望むならば、あなたはいくつかのオプションがあります:

  • が希望のコードを入れて(それが実行時間の長いネットワーク呼び出しがある場合は、おそらくない良いアイデア)最初の場所でAsyncTaskを使用しないでください
  • AsyncTaskが完了した後に実行すると、onPostExecuteメソッドのバックグラウンドが実行され、バックグラウンドメソッドから返されたデータの結果にアクセスできます。
  • 完了時に呼び出すことができるAsyncTaskへのコールバックを提供します以前のオプションに変更しましたが、より正式で変更に強い)

私は最後のオプションを好みますが、他のオプションよりも書き込みに時間がかかります。

アクティビティが終了してシャットダウンした後に、AsyncTaskがバックグラウンドで作業したり終了したりする可能性があることを忘れないでください。UIとの対話を開始する前に、その状態を適切にチェックしてください。

0

ネットワーク通話をしようとしている場合は、loopjまたはgoogleのvolleyライブラリを使用する代わりにasynctaskを使用しないでください。

Asynctaskは、ここでasynctaskクラスの例だと言った、長いネットワーク呼び出しのためのものではありません、コード:

class AsyncTaskExample extends AsyncTask<Void, Integer, String> { 
    private final String TAG = AsyncTaskExample.class.getName(); 
    protected void onPreExecute(){ 
    Log.d(TAG, "On preExceute..."); 
    } 

    protected String doInBackground(Void...arg0) { 

     Log.d(TAG, "On doInBackground..."); 

     for(int i = 0; i<5; i++){ 
      Integer in = new Integer(i); 
      publishProgress(i); 
     } 

     return "You are at PostExecute";} 

    protected void onProgressUpdate(Integer...a){ 
     Log.d(TAG,"You are in progress update ... " + a[0]); 
    } 

    protected void onPostExecute(String result) { 
     Log.d(TAG,result); 
     } 
    } 

編集、それをあなたが希望し、お好きな時にあなたのコード内で新しいものをインスタンス化するようチェックを行うには、 は、それが

1

あなたは以下の実施例を参照する方法をonPostExecuteオーバーライドする必要がお役に立てば幸いです

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 
+0

私はToast.maketextやこれのようないくつかの機能の使用を知っていますが、私はアクティビティクラスでコーディングしているときのように動作したいと思っています。敵の例で活動を開始する –

関連する問題