我喜欢在进入循环内部时如何更新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
我做了另外的例外......任何想法?
答案 0 :(得分:3)
您不需要在doInBackground中发布Runnable。 AsyncTask
有一个名为onProgressUpdate()
的方法,您应该为进度更新实施该方法。这将在UI线程上调用。实现该方法并在循环结束时添加publishProgress()
。
您也不应该在doInBackground()
内操纵任何UI组件(如进度条)。所有这些都需要在UI线程上进行,因此请在onProgressUpdate()
中进行。
答案 1 :(得分:3)
Uuuuhhhh ....使用onProgressUpdate()
?
http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)
答案 2 :(得分:2)
这里实际发生的是textV.setText(pb.getProgress());
正在调用
setText(int resourceId)
不是
setText(String text)
您想致电:
textV.setText(Integer.toString(pb.getProgress()));
而不是
textV.setText(pb.getProgress());