-1

私はアンドロイドの初心者です。Androidの組み込みメッセンジャークラスを拡張するクラスで、AsyncTaskを使用してプログレスバーを制御しようとしています。例外が発生していますが、コードの障害を理解できません。

public class MyMessenger extends Service {

private ProgressDialog downloadProgressDialog;
static final int v1=1,v2=2;
ProgressBar bar;
class MyHandler extends Handler
{
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case v1:

            Toast.makeText(getApplicationContext(), "message = 1 in handler of messenger", Toast.LENGTH_LONG).show();
            break;
        case v2:
            new sync().execute();
                        break;

        }
    }
}
Messenger messenger=new Messenger(new MyHandler());
@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    //Toast.makeText(getApplicationContext(), "binding...", Toast.LENGTH_LONG).show();
    return messenger.getBinder();

}
public class sync extends AsyncTask<Void, Integer, Void>
{
    int progress=0;
    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
    //  super.onProgressUpdate(values);

        downloadProgressDialog.setProgress(values[0]);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        while (progress<100) {
            progress++;
            publishProgress(progress);
            SystemClock.sleep(1000);
        }
        return null;
    }
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();

        downloadProgressDialog = new ProgressDialog(getApplicationContext());
        downloadProgressDialog.setMessage("Downloading file...");
        downloadProgressDialog.setMax(100);
        downloadProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        downloadProgressDialog.setCancelable(false);
        downloadProgressDialog.show();
    }

}

}

4

4 に答える 4

2

を初期化することbarはないため、で使用すると null になりますbar.setProgress(values[0])

于 2013-06-21T11:14:25.013 に答える
1

プログレスバーを初期化していないためです。以下のように初期化します。

bar =  (ProgressBar) findViewById(R.id.progressbar);

編集:

次に、以下のような進行状況バーではなく、Progressdialog を使用する必要があります。

private ProgressDialog downloadProgressDialog;

protected void onPreExecute() {
        super.onPreExecute();

       downloadProgressDialog = new ProgressDialog(context);
            downloadProgressDialog.setMessage("Downloading file...");
            downloadProgressDialog.setMax(100);
            downloadProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            downloadProgressDialog.setCancelable(false);
            downloadProgressDialog.show();
    }

次に、progressupdate メソッドでダイアログ オブジェクトを使用します。

編集:

Binder を介してアクティビティにコールバックを送信できます。つまり、進行状況ダイアログのような UI を更新できます。

Add according method to your Binder (let's name it onProgress)
From your AsyncTask call method of this Binder
In order to know about progress updates consider using Observer pattern (in other words - your Activity should listen for updates of your Binder, or more specifically - of calling Binder.onProgress method)
于 2013-06-21T11:17:56.720 に答える
0

進行状況ダイアログを表示できません。バックグラウンドでスレッドを実行するために使用されるサービス クラスを拡張しています。doinbackground() メソッドのみを使用し、進行状況ダイアログ メソッドを削除します。

于 2013-06-21T11:32:10.343 に答える