1

概念を理解するためにAsyncTaskを実装しています。コードは機能していますが、私が望む方法ではありません。私は文書を調べましたが、私が何をしているのかを正確に特定することはできません。

コード:

private class NewThread extends AsyncTask<Integer, Integer , String>
    {

        @Override
        protected String doInBackground(Integer... params) {
            Log.d(TAG,"inside doInBackground");
            for (int i=0;i<params.length;i++)
            {
                 try {
                publishProgress(i);
                    Thread.sleep(6000);

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
            return "Finished";
        }

        @Override
        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
            Log.d(TAG,"inside onPostExecute");
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
            Toast.makeText(getBaseContext(), "Done " + values[0], Toast.LENGTH_SHORT).show();
            Log.d(TAG,"inside onProgressUpdate");
        }

私は見るだけ Done 0ですFinished。私が期待していたのは、Done0、Finished、Done1、Finished、Done2です。終了しました....またはDone0Done1Done2....終了しました。

それを行うには、コードを何に変更する必要がありますか?それも可能ですか?

ボタンを使用してAsyncTaskを呼び出しています。

public void onClick(View v) {
        // TODO Auto-generated method stub
        new NewThread().execute(4);


    }

ありがとう

4

4 に答える 4

1

同期タスクを呼び出すコードが表示されない場合、これは単なる推測です。params値を正しく使用していないようです。そのはず:

 for(int i = 0; i < params[0]; i++)
于 2012-04-25T07:08:29.387 に答える
1

開始に使用するコードは、パラメーターとしてAsyncTask渡して1つのインスタンスを開始4します。したがって、param.length()は1(1)であり、出力は1つだけです。

代わりにこれを試してください:

new NewThread().execute(1,2,3,4);

または、複数のスレッドが同時に動作することを確認したい場合は、次のようにします。

new NewThread().execute(1);
new NewThread().execute(2);
new NewThread().execute(3);
于 2012-04-25T07:08:54.613 に答える
1

これを変える:

@Override
        protected String doInBackground(Integer... params) {
            Log.d(TAG,"inside doInBackground");
            for (int i=0;i<params.length;i++)

@Override
        protected String doInBackground(Integer myCount) {
            Log.d(TAG,"inside doInBackground");
            for (int i=0;i<myCount;i++)
于 2012-04-25T07:11:24.827 に答える
1

非同期タスクが正しく実行されます。1つの項目を含む配列を渡し、ループ内で配列の長さが1であるかどうかを確認しているため、「印刷」は1つだけです。

ループ内のいずれかを置き換えます

また、もう1つの小さな間違いがあります。これは、done 0、done1..が印刷されることを期待しています。しかし、あなたのステートメントは "Done" + values [0]であり、常に同じステートメントを出力します:)

于 2012-04-25T07:13:01.997 に答える