gpt4 book ai didi

java - 在 UIThread 上运行并发布查看,仍然得到 CalledFromWrongThreadException

转载 作者:行者123 更新时间:2023-11-29 21:39:57 25 4
gpt4 key购买 nike

标题说明了一切。好吧,主要是。这只发生在 1 台设备上。其他设备没问题。

AsyncTaskonPostExecute 中,我调用下面的代码,在得到这个异常之前我没有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com