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 0Finished。我期待的是 Done0 , Finished, Done1, Finished, Done2。完成....或完成0 完成1 完成2 ....完成。

我应该在代码中更改什么来做到这一点?甚至可能吗?

我正在使用按钮调用 AsyncTask。

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


    }

谢谢

4

4 回答 4

1

异步任务已正确执行。您正在传递一个包含一个项目的数组,并且在循环中您正在检查数组的长度为 1,因此您只会得到一个“打印”。

要么在循环替换

还有一个小错误,您希望 done 0, done 1 .. 被打印出来。但是您的声明是 "Done" + values[0] ,它将始终打印相同的声明:)

于 2012-04-25T07:13:01.997 回答
1

在没有看到您调用同步任务的代码的情况下,这只是一个猜测。看起来您没有正确使用 params 值。它应该是:

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

用于启动 1(一个)实例的代码,作为参数AsyncTask传递。4因此,param.length()是 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 回答