- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
标题说明了一切。好吧,主要是。这只发生在 1 台设备上。其他设备没问题。
在 AsyncTask
的 onPostExecute
中,我调用下面的代码,在得到这个异常之前我没有 runOnUiThread
,添加了 runnable,因为我收到 CalledFromWrongThreadException 异常。
编辑
这是我的发现。在某些情况下,一个应用程序可以有多个“循环程序”,因此也可以有多个“UI 线程”。
由于一个应用程序可以有多个“UI 线程”并且 AsyncTask 总是“在 UI 线程上运行”[引用],有人决定 [很糟糕] AsyncTask 不总是在它的创建线程上运行(在 99.999999 % 的案例将是正确的“UI 线程”),他们决定使用 hocus pocus(或您决定的制作不当的快捷方式)在“主循环程序”上执行。
Android: got CalledFromWrongThreadException in onPostExecute() - How could it be?
所以现在看来我需要找到一种方法来确保异步任务线程始终是应用程序所在的循环线程:(
getParentActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
setAdapterData(result);
}
});
当这不起作用时,我也尝试了这个,并一起尝试了它们。
lvUpdatesList.post(new Runnable()
{
@Override
public void run()
{
lvUpdatesList.setAdapter(updateListAdapter);
}
});
我对它为什么会这样表现感到非常困惑。
07-03 13:19:51.908: E/AndroidRuntime(4479): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.view.View.invalidate(View.java:5279)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.widget.AbsListView.resetList(AbsListView.java:1120)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.widget.ListView.resetList(ListView.java:511)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.widget.ListView.setAdapter(ListView.java:440)
07-03 13:19:51.908: E/AndroidRuntime(4479): at com.********.********.FragmentUpdates.setAdapterData(FragmentUpdates.java:213)
07-03 13:19:51.908: E/AndroidRuntime(4479): at com.********.********.FragmentUpdates$AsyncGetUpdates.onPostExecute(FragmentUpdates.java:185)
07-03 13:19:51.908: E/AndroidRuntime(4479): at com.********.********.FragmentUpdates$AsyncGetUpdates.onPostExecute(FragmentUpdates.java:1)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.AsyncTask.finish(AsyncTask.java:417)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.AsyncTask.access$300(AsyncTask.java:127)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.Looper.loop(Looper.java:130)
07-03 13:19:51.908: E/AndroidRuntime(4479): at android.os.HandlerThread.run(HandlerThread.java:60)
完整的异步任务
class AsyncGetUpdates extends AsyncTask<Void, Void, List<UpdateDTO>>
{
String userId;
@Override
protected void onPreExecute()
{
showDialog();
userId = getParentActivity().getCurrentUser().getUser_id();
super.onPreExecute();
}
@Override
protected List<UpdateDTO> doInBackground(Void... params)
{
boolean followingOnly = false;
if (myState == MyState.Following)
followingOnly = true;
return APIHelper.getUpdates(userId, followingOnly, count);
}
@Override
protected void onPostExecute(final List<UpdateDTO> result)
{
killDialog();
isCurrentlyUpdating = false;
getParentActivity().runOnUiThread(new Runnable()
{
@Override
public void run()
{
setAdapterData(result);
}
});
super.onPostExecute(result);
}
}
最佳答案
对于 future ,如果人们遇到这个问题(在任何 Post JellyBean 设备中都不会出现),这就是您解决问题的方法。
您在应用中做的第一件事就是这个。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_splash);
this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
new AsyncInitLooperTask().execute();
}
});
}
public class AsyncInitLooperTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... params)
{
return null;
}
}
它的作用是将为您的应用处理 AsyncTasks 的 InternalHandler
附加到您的应用正在使用的正确 Looper/UIThread。
关于java - 在 UIThread 上运行并发布查看,仍然得到 CalledFromWrongThreadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456529/
我已经看到很多关于这个主题的问题,但我对任何答案都不满意。 我希望它有一个 class ConnectionController implements Runnable 负责打开到服务器的连接,读取和
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon
当我按下按钮时,我不断收到 CalledFromWringThreadException。 我的程序是这样的: public class MainActivity extends Activity i
我正在创建一款使用 Sphero 机器人球的游戏。当游戏开始/恢复时,它会检查配对或连接的球。如果蓝牙关闭,或者没有配对球,它会隐藏连接窗口。如果有配对但未连接的球,则转到此功能。 // If the
我们从 Crashlytics 收到错误报告,影响了相当一部分用户(大约 10%)。这是一个 CalledFromWrongThreadException。 问题是我不知道是什么导致了这个问题,我自己
我有一个 Activity 启动然后创建一个新的 NetworkHandler 实例,在 NetworkHandler 中我在一个新线程上运行它,这样 UI 线程就不会被卡住。 NetworkHand
我在 ListView 中显示了网页下载百分比的进度条。 for(int i=0;i { int id; public UploadTask(int id) {
我有一个 IntentService 可以像这样更新偏好: SharedPreferences.Editor editor = userPrefs.edit(); editor.putInt("COU
我正在尝试使用 Kotlin 协程在后台运行一些繁重的工作。 但是我收到了这个错误信息, 'android.view.ViewRootImpl$CalledFromWrongThreadExcepti
我有一种感觉是我的计时器导致了这次崩溃。奇怪的是我似乎无法在模拟器中重现它,但我的 Play 控制台崩溃报告告诉我用户不断遇到此崩溃: android.view.ViewRootImpl$Called
我使用的是 this , 显示来自互联网的图像,但它会引发如下错误: 04-12 13:45:05.337: E/AndroidRuntime(27897): Caused by: android.v
我的 logcat 中出现错误,指出: java.net.UnknownHostException: apps.example.com 09-13 14:57:28.970: W/System.err
我是 Android 初学者,所以如果这是一个愚蠢的问题,请友善。 我正在尝试动态更新四个 TextView。每当我尝试更新它们时,程序就会崩溃。 我不明白“只有创建 View 层次结构的原始线程才能
我在编写的应用程序中遇到一个非常奇怪的问题。这可能很简单,我对服务、AsyncTasks 以及何时可以再次访问 UI 线程有一些误解。 该应用程序包含一个主要 Activity ,您可以通过该 Act
我正在按照 android 教程构建天气应用程序,但是当我尝试将 mTemperature TextView 设置为我从预测 API 获得的温度时,我收到此错误“android.view.ViewRo
我在做 Espresso 测试时出错 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original threa
我已经创建了一个可以从 Activity 中的任何地方访问的 Handler,并且还编写了一个方法来更轻松地调用处理程序: private Handler textFromBGThread = new
我正在为一个 Android 应用开发一个测试类,我收到了一个 android.view.ViewRootImpl$CalledFromWrongThreadException。该代码假设模拟输入到文
我正在使用 OpenCV 库实现一个应用程序。处理完相机的 inputFrame 后,我想更新我的 TextView。但是,我收到以下错误: 08-01 17:01:45.085: E/Android
我不确定我的低估是否正确,因为我没有得到预期的输出。我有一个类,我在其中调用一个应该启动线程的方法。 public class MainActivity extends Activity { prot
我是一名优秀的程序员,十分优秀!