0

数日間、いくつかの問題があります。メインスレッドで何かをしている間、(ダイアログではなく)単純なものを表示する必要がありProgressBarます...非常に単純な質問だと思いましたが、これはできません。助けてください。

最初に私はsetVisibility(View.VISIBLE)前後に簡単に試しsetVisibility(View.GONE)ました。

しかし、これは同じスレッドで実行されておりProgressBar、関数が動作している間はフリーズしました。

今、私はこのコードを持っていますが、いくつかのエラーがあり、何が悪いのかわかりません。

私のシンプルなレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
<ProgressBar
    android:id="@+id/loading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:visibility="gone" />
</FrameLayout>

私は基本的な活動をしています:

public class BaseActivity extends Activity {
    public ProgressBar loading;

    public class ProgressBarShow extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... unused) {
        return(null);
    }

    protected void onProgressUpdate() {
    }
    protected void onPreExecute() {
        loading.setVisibility(View.VISIBLE);
    }

    protected void onPostExecute() {
    }
   }
}

そして最後に私の作業活動はBaseActivity

public class SearchActivity extends BaseActivity {
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        loading = (ProgressBar) findViewById(R.id.loading);

        new ProgressBarShow().execute();
        //doing long stuff
        //new ProgressBarHide().execute(); there isnt, but sense the same
    }
}

BaseActivityコードを重複させないために、プログレスバーを必要とする多くのアクティビティがあります。そのため、私は作成しました。

メインウィンドウをフリーズし、ユーザーに何もさせたくないので(ボタンをクリックするなど)、メインスレッドで長い作業(スタッフ機能)を行う必要があります。作業中のProgressBarを表示するだけです。

私の例では何が問題になっていますか?または、どうすればこれを改善できるかアドバイスをください

4

2 に答える 2

2
class ProgressTask extends AsyncTask<Integer, Integer, Void>{
    ProgressBar progress;
    Context context;
    public ProgressTask(ProgressBar progress, Context context) {
        this.progress = progress;
        this.context = context;

    }
    @Override
    protected void onPreExecute() {
        // initialize the progress bar
        // set maximum progress to 100.
        progress.setMax(100);

    }


    @Override
    protected Void doInBackground(Integer... params) {
        // get the initial starting value
        int start=params[0];


        // increment the progress
        for(int i=start;i<=100;i+=5){
            try {
                boolean cancelled=isCancelled();
                //if async task is not cancelled, update the progress
                if(!cancelled){
                    publishProgress(i);
                    SystemClock.sleep(1000);

                }

            } catch (Exception e) {
                Log.e("Error", e.toString());
            }

        }
        return null;
    }
    //Has direct connection to UI Main thread
    //Called everytime publishProgress(int) is called in doInBackground
    @Override
    protected void onProgressUpdate(Integer... values) {
        progress.setProgress(values[0]);
        Toast.makeText(context, "test"+values[0], Toast.LENGTH_SHORT).show();
    }


    @Override
    protected void onPostExecute(Void result) {
        // async task finished
                    Log.v("Progress", "Finished");
    }
    @Override
    protected void onCancelled() {
        progress.setMax(0);
    }
}
于 2012-04-06T08:52:56.107 に答える
0

AsyncTaskを使用するhttp://developer.android.com/guide/topics/fundamentals/processes-and-threads.htmlすべての作業がメインスレッドで行われている間に、ProgressBarをその中に入れます

于 2012-04-06T08:55:01.610 に答える