0

インターネットからデータを取得して解析し、ユーザーに表示しようとしています。アクションには通常3秒ほどかかります。スピナーのProgressDialogに、データを読み込んでいることを示すメッセージを表示したいと思います。問題は、ProgressDialogがロードがほぼ完了したときにのみ表示されることです。これは私のコードです

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button load_routes = (Button)findViewById(R.id.load_routes);

    load_routes.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            task_complete = false;
            progressBar = new ProgressDialog(v.getContext());
            progressBar.setCancelable(false);
            progressBar.setMessage("Fetching routes data ...");
            progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressBar.show();

            if(haveNetworkConnection())
            {
                loading_routes_data(v);
            }
            else
            {
                progressBar.dismiss();
            }
        }
    });
}

そしてこれはonclickと呼ばれる私の関数です

private void loading_routes_data(View v)
{
    try
    {
        new Thread(new Runnable()
        {
            public void run()
            {
                while(!task_complete)
                {
                    refresh_routes();
                    try
                    {
                        Thread.sleep(1000);
                    }
                    catch(InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
                runOnUiThread(new Runnable()
                {
                    public void run()
                    {
                        progressBar.dismiss();
                    }
                });
            }
        }).start();
    }
    catch(Exception e)
    {
    }

    while(!task_complete)
    {
    }
}

私のrefresh_routes()関数はデータを取得し、それを解析してからに設定task_completetrueます。whileループ内に保持する必要があるかどうかさえわかりません。

それが私の大きな問題です。ProgressDialogボタンをクリックするとすぐに表示したいのですが、電話をかけたいのですがrefresh_routes()refresh_routes()完了したら進行状況ダイアログを削除したいと思います。しかし、どうすればそれができるのかわかりません。

誰かが例としていくつかの記事などで問題を解決する方法を教えてくれたら、私は本当に感謝します。前もって感謝します :)

4

2 に答える 2

2

while(!task_complete)メソッドの最後で呼び出すことにより、UIスレッドをロックしています。あなたは本当にAsyncTaskこのような操作のためにを使用する必要があります。これがあなたAsyncTaskがどのように見えるべきかです:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    private ProgressDialog progressDialog;
    private Context context;

    public MyAsyncTask(Context context) {

        this.context = context;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
        progressDialog = ProgressDialog.show( context, null, "Fetching routes data ..." );
    }

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

        while (!task_complete) {
            refresh_routes();
            try {
                Thread.sleep( 1000 );
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute( Void result ) {

        super.onPostExecute( result );
        progressDialog.dismiss();
    }
}

これを実行するには、次のようにします。

new MyAsyncTask( this ).execute();

メソッドがどのように機能するかはわかりませんrefresh_routes()が、メソッド内でその機能を移動することを検討してくださいdoInBackground()

于 2012-04-07T00:33:42.760 に答える
1

これを行うには、 AsyncTaskを使用します。アクティビティでマルチスレッドを実行するための優れた機能を提供します。

于 2012-04-07T00:26:17.430 に答える