在AsyncTask循环期间更新TextView

时间:2013-05-07 22:20:25

标签: android android-asynctask

我喜欢在进入循环内部时如何更新textview AsyncTask
在这里我做了什么:

    for (int i = 0; i < buffer.length; i += bufferLength) {
        pb.setMax(kbfilesize);
        int prog = i/bufferLength;
        pb.setProgress(prog);
        new Timer().schedule(new TimerTask() {

            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    public void run() {
                        textV.setText(pb.getProgress());
                    }
                });
            }
        }, 0, 100);
        outStream1.writeBytes(lineEnd + twoHyphens + boundary + twoHyphens + lineEnd);
    }

同样我已经读过我在使用runOnUiThread时不必使用AsyncTask我可以从AsyncTask更新用户界面,但每次我尝试做我得到一个例外:

05-08 01:12:43.511: W/ResourceType(32344): No package identifier when getting value for resource number 0x00000000
05-08 01:12:43.521: W/dalvikvm(32344): threadid=11: thread exiting with uncaught exception (group=0x41eff2a0)
05-08 01:12:43.531: E/AndroidRuntime(32344): FATAL EXCEPTION: AsyncTask #1
05-08 01:12:43.531: E/AndroidRuntime(32344): java.lang.RuntimeException: An error occured while executing doInBackground()
05-08 01:12:43.531: E/AndroidRuntime(32344):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.lang.Thread.run(Thread.java:856)
05-08 01:12:43.531: E/AndroidRuntime(32344): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
05-08 01:12:43.531: E/AndroidRuntime(32344):    at android.content.res.Resources.getText(Resources.java:242)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at android.widget.TextView.setText(TextView.java:3800)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at com.linesmedia.MainActivity$FileUploadTask.doInBackground(MainActivity.java:255)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at com.linesmedia.MainActivity$FileUploadTask.doInBackground(MainActivity.java:1)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-08 01:12:43.531: E/AndroidRuntime(32344):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-08 01:12:43.531: E/AndroidRuntime(32344):    ... 4 more

即使我使用runOnUiThread我做了另外的例外......任何想法?

3 个答案:

答案 0 :(得分:3)

您不需要在doInBackground中发布Runnable。 AsyncTask有一个名为onProgressUpdate()的方法,您应该为进度更新实施该方法。这将在UI线程上调用。实现该方法并在循环结束时添加publishProgress()

您也不应该在doInBackground()内操纵任何UI组件(如进度条)。所有这些都需要在UI线程上进行,因此请在onProgressUpdate()中进行。

答案 1 :(得分:3)

答案 2 :(得分:2)

这里实际发生的是textV.setText(pb.getProgress());正在调用

setText(int resourceId)

不是

setText(String text)

您想致电:

textV.setText(Integer.toString(pb.getProgress()));

而不是

textV.setText(pb.getProgress());