1

ユーザーがアプリケーションでタブを押すと、進行状況バーを表示するバックグラウンド タスクが開始されます。

これを行うには、アクティビティの onResume() から AsyncTask を起動します。問題は、これを行うときに進行状況ダイアログが表示されないことです。バックグラウンド タスクが正常に実行され、onPostExecute の実行後にフォーカスがアクティビティに返され、アプリケーションは通常どおり続行されます。

onResume = から AsyncTask を起動するにはどうすればよいですか? または、アクティビティが開始されたときに、onPreExecute で作成されたアクティビティのレイアウト/進行状況バーを表示するにはどうすればよいですか?

現在、コードは次のように機能します。

http://pastebin.com/KUsg3Mriただし、タブを変更して onCreate が呼び出されると、非同期タスクが開始されます-タブの内容を変更したり、進行状況バーを表示したりせずに、非同期タスクが終了すると、アクティビティはすべてのGUIを表示します要素が正常に

http://pastebin.com/KUsg3Mriを実行して、onCreate または onResume から findReplays を開始します - これにより進行状況ダイアログが表示されます - しかし、publishProgress は onProgressUpdate を呼び出すことはありません - そのため、近いですが、葉巻はありません!

4

2 に答える 2

1

これを試して....

UIスレッドからAsyncTask<>のexecute()メソッドを実行する前にProgressDiaglog初期化を使用し、return文の前にAsyncTask<>のdoInBackground()メソッドでdismiss()を呼び出します...

それをよりよく説明する例....

public class AsyncTaskExampleActivity extends Activity 
{
        protected TextView _percentField;
        protected Button _cancelButton;
        protected InitTask _initTask;
        ProgressDialog pd;

    @Override
    public void onCreate( Bundle savedInstanceState ) 
    {
        super.onCreate(savedInstanceState);

        setContentView( R.layout.main );

        _percentField = ( TextView ) findViewById( R.id.percent_field );
        _cancelButton = ( Button ) findViewById( R.id.cancel_button );
        _cancelButton.setOnClickListener( new CancelButtonListener() );

        _initTask = new InitTask();


         pd = ProgressDialog.show(AsyncTaskExampleActivity.this, "Loading", "Please Wait");


        _initTask.execute( this );
    }

    protected class CancelButtonListener implements View.OnClickListener 
    {
                public void onClick(View v) {
                        _initTask.cancel(true);
                }
    }

    /**
     * sub-class of AsyncTask
     */
    protected class InitTask extends AsyncTask<Context, Integer, String>
    {
        // -- run intensive processes here
        // -- notice that the datatype of the first param in the class definition matches the param passed to this method 
        // -- and that the datatype of the last param in the class definition matches the return type of this method
                @Override
                protected String doInBackground( Context... params ) 
                {
                        //-- on every iteration
                        //-- runs a while loop that causes the thread to sleep for 50 milliseconds 
                        //-- publishes the progress - calls the onProgressUpdate handler defined below
                        //-- and increments the counter variable i by one
                        int i = 0;
                        while( i <= 50 ) 
                        {
                                try{
                                        Thread.sleep( 50 );
                                        publishProgress( i );
                                        i++;
                                } catch( Exception e ){
                                        Log.i("makemachine", e.getMessage() );
                                }
                        }
                        pd.dismiss(); 
                        return "COMPLETE!";
                }

                // -- gets called just before thread begins
                @Override
                protected void onPreExecute() 
                {
                        Log.i( "makemachine", "onPreExecute()" );

                        super.onPreExecute();

                }

                // -- called from the publish progress 
                // -- notice that the datatype of the second param gets passed to this method
                @Override
                protected void onProgressUpdate(Integer... values) 
                {
                        super.onProgressUpdate(values);
                        Log.i( "makemachine", "onProgressUpdate(): " +  String.valueOf( values[0] ) );
                        _percentField.setText( ( values[0] * 2 ) + "%");
                        _percentField.setTextSize( values[0] );
                }

                // -- called if the cancel button is pressed
                @Override
                protected void onCancelled()
                {
                        super.onCancelled();
                        Log.i( "makemachine", "onCancelled()" );
                        _percentField.setText( "Cancelled!" );
                        _percentField.setTextColor( 0xFFFF0000 );
                }

                // -- called as soon as doInBackground method completes
                // -- notice that the third param gets passed to this method
                @Override
                protected void onPostExecute( String result ) 
                {

                        super.onPostExecute(result);
                        Log.i( "makemachine", "onPostExecute(): " + result );
                        _percentField.setText( result );
                        _percentField.setTextColor( 0xFF69adea );
                        _cancelButton.setVisibility( View.INVISIBLE );
                }
    }    
}
于 2012-07-02T17:14:54.500 に答える
0

わかった!最終的にandroid-devIRCチャネルを介して解決策が見つかりました。

タスクは機能していましたが、progressPublish呼び出しがUIにフィルターされなかった理由は、AsyncTask実行を呼び出し、すぐに.get()メソッドを呼び出したためです。これを使って!

そこで、.get()メソッドを削除し、関連するコードセクションをonPostExecuteに配置しました。すべてが完全に機能しています。

于 2012-07-03T23:55:52.433 に答える