0

ボタンを押すと、次のコードが実行されます。

public void onClick(View v) {
            // TODO Auto-generated method stub
            //progressSpin.setVisibility(View.VISIBLE);
            try {
                data=new WebkioskExtractor().execute(username,password).get();
                System.out.println("Data = "+data);                 
            } catch (Exception e) {
                // TODO Auto-geneorated catch block
                e.printStackTrace();
            }
            //progressSpin.setVisibility(View.GONE);
        }

コードから明らかなように、返されるデータに依存しているため、AsyncTask が終了するまで待つ必要があります。問題は、タスクが実行されている間 (インターネットからデータを取得している間)、ボタンが押された状態のままになることです。作成したプログレスバーをVISIBLEに設定しても表示されません。

どうすればこれを修正できますか? ボタンを1回押すと、プログレスバーが回転し始めますが、これは発生していません。

4

1 に答える 1

5

使用しないでくださいget()

data=new WebkioskExtractor().execute(username,password).get();  // Bad! :(

data=new WebkioskExtractor().execute(username,password);  // Good! :) 

それはあなたの残りが押されたUI理由です。Buttonこれが、あなたの が表示されない理由でもありますProgressBar( で実行されますUI)。ProgressBarで開始し、で開始するonPreExecute()dismiss()onPostExecute()ますAsyncTask。そうでない場合、これはあなたがすべきことです。他のすべてがAsyncTask正しく設定されている場合は、削除.get()すると問題が解決するはずです。

doInBackground()からの結果を返すonPostExecute()と、これにより、必要なものが得られます。UIまた、 fromまたはbeforeonPostExecute()のその他のメソッドで必要なことは何でも行うことができます。AsyncTaskdoInBackground()

プログレスバー

Visibilityに を設定する必要はありませんProgressBar。次の例を参照してください。

public class GetUsersTask extends AsyncTask<Void, Void, Void> {
    ProgressDialog progress = ProgressDialog.show(LoginScreen.this, "Downloading Users", "Please wait while users are downloaded");
     // you can create it here

    @Override
    protected void onPreExecute()
    {
        // show it here like so
        progress.setCancelable(false);
        progress.isIndeterminate();
        progress.show();
    }

    @Override
    protected void onPostExecute(Void result) {

            // and dismiss it here
            progress.dismiss();
        }

    } 

    @Override
    protected void onProgressUpdate(Void... values) {
        // can update the ProgressBar here if you need to
    }

    @Override
    protected Void doInBackground(Void... params) {
        ...
         }

コールバックの使用

AsyncTaskActivity の内部クラスではない結果を取得する必要がある場合は、interfaceを とともに使用できますcallBackこの回答でそれを行うことの詳細

AsyncTask ドキュメント

于 2013-07-02T12:39:18.950 に答える