【发布时间】:2020-03-01 18:45:56
【问题描述】:
protected Long doInBackground(String... address) {
while(true){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
setProgress(100);
onProgressUpdate(getping(address[0]));
}
}
protected void onProgressUpdate(Long... values){
result.setText(String.valueOf(values[0]));
builder.setContentText(String.valueOf(values[0]));
notificationManager.notify(1,builder.build());
}
此块在 Android Oreo 及更高版本上运行良好,但无法在以下任何版本上设置文本
日志猫:-
11-05 16:18:26.041 4720-4752/com.pcartistofficial.pingtesterforgames E/AndroidRuntime:致命异常:AsyncTask #1 进程:com.pcartistofficial.pingtesterforgames,PID:4720 java.lang.RuntimeException:执行 doInBackground() 时发生错误 在 android.os.AsyncTask$3.done(AsyncTask.java:304) 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:222) 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 在 java.lang.Thread.run(Thread.java:818) 引起:android.view.ViewRootImpl$CalledFromWrongThreadException:只有 创建视图层次结构的原始线程可以触及其视图。 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357) 在 android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909) 在 android.view.ViewGroup.invalidateChild(ViewGroup.java:4690) 在 android.view.View.invalidateInternal(View.java:11801) 在 android.view.View.invalidate(View.java:11765) 在 android.view.View.invalidate(View.java:11749) 在 android.widget.TextView.checkForRelayout(TextView.java:6858) 在 android.widget.TextView.setText(TextView.java:4057) 在 android.widget.TextView.setText(TextView.java:3915) 在 android.widget.TextView.setText(TextView.java:3890) 在 com.pcartistofficial.pingtesterforgames.MainActivity$BackgroundTasker.onProgressUpdate(MainActivity.java:96) 在 com.pcartistofficial.pingtesterforgames.MainActivity$BackgroundTasker.doInBackground(MainActivity.java:90) 在 com.pcartistofficial.pingtesterforgames.MainActivity$BackgroundTasker.doInBackground(MainActivity.java:67) 在 android.os.AsyncTask$2.call(AsyncTask.java:292) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 在 java.lang.Thread.run(Thread.java:818)
【问题讨论】:
-
错误提示“只有创建视图层次结构的原始线程才能触及其视图”。这意味着您正在尝试从非 ui 线程访问视图,可能在 doInBackground 方法中
-
@Emil 但它在 Android Oreo + 上运行良好。使用相同的确切代码。
-
顺便说一句,发出命令是从 doInBackground() 调用的 onProgressUpdate(2) 。我如何修改,使其也适用于以前的版本
-
最好也放你的doinbackground方法代码。因为它只显示该方法中的错误。