Java 异步任务无法访问原始线程
我已将代码移动到异步任务,以便在后台线程上执行操作。代码如下:Java 异步任务无法访问原始线程,java,android,android-asynctask,Java,Android,Android Asynctask,我已将代码移动到异步任务,以便在后台线程上执行操作。代码如下: public class AsynTaskActivity extends AsyncTask<HashMap<String, Integer>, Void, Void> { @Override protected Void doInBackground(HashMap<String, Integer>... hashMaps) { HashMap&
public class AsynTaskActivity extends AsyncTask<HashMap<String, Integer>, Void, Void>
{
@Override
protected Void doInBackground(HashMap<String, Integer>... hashMaps)
{
HashMap<String, Integer> maps = hashMaps[0];
//
Set set = maps.entrySet();
for (Object aSet : set)
{
Map.Entry entry = (Map.Entry) aSet;
receiveBarcode(entry.getKey().toString());
}
return null;
}
}
我假设doInbackground在一个单独的线程上运行,不应该遇到这个错误 在对活动的引用上使用
runOnUiThread()
在AsyncTask
中对活动的引用上使用runOnUiThread()
您永远不能在doInBackgound
中执行UI交互,但是,如果您分别通过onProgressUpdate
和onPostExecute
传递进度或结果,您仍然可以更新UI,这就是重新获得UI线程的方式。您可以尝试将AsyncTask
更改为以下内容:
public class AsynTaskActivity extends AsyncTask<HashMap<String, Integer>, String, Object> {
@Override
protected Object doInBackground(HashMap<String, Integer>... hashMaps) {
// non-ui thread
HashMap<String, Integer> maps = hashMaps[0];
Set set = maps.entrySet();
for (Object aSet : set) {
Map.Entry entry = (Map.Entry) aSet;
publishProgress(entry.getKey().toString()); // onProgressUpdate callback
}
return null; // onPostExecute callback
}
@Override
protected void onProgressUpdate(String... progress) {
// ui thread
receiveBarcode(progress);
}
@Override
protected void onPostExecute(Long result) {
// ui thread
}
}
公共类AsynTaskActivity扩展了AsyncTask{
@凌驾
受保护对象doInBackground(HashMap…hashMaps){
//非ui线程
hashMaps=hashMaps[0];
Set=maps.entrySet();
用于(对象集合:集合){
Map.Entry=(Map.Entry)aSet;
publishProgress(entry.getKey().toString());//onProgressUpdate回调
}
返回null;//onPostExecute回调
}
@凌驾
受保护的void onProgressUpdate(字符串…进度){
//用户界面线程
接收条形码(进度);
}
@凌驾
受保护的void onPostExecute(长结果){
//用户界面线程
}
}
在
AsyncTask
中,您永远不能在doInBackgound
中执行UI交互,但是如果您分别通过onProgressUpdate
和onPostExecute
传递进度或结果,您仍然可以更新UI,这就是重新获得UI线程的方式。您可以尝试将AsyncTask
更改为以下内容:
public class AsynTaskActivity extends AsyncTask<HashMap<String, Integer>, String, Object> {
@Override
protected Object doInBackground(HashMap<String, Integer>... hashMaps) {
// non-ui thread
HashMap<String, Integer> maps = hashMaps[0];
Set set = maps.entrySet();
for (Object aSet : set) {
Map.Entry entry = (Map.Entry) aSet;
publishProgress(entry.getKey().toString()); // onProgressUpdate callback
}
return null; // onPostExecute callback
}
@Override
protected void onProgressUpdate(String... progress) {
// ui thread
receiveBarcode(progress);
}
@Override
protected void onPostExecute(Long result) {
// ui thread
}
}
公共类AsynTaskActivity扩展了AsyncTask{
@凌驾
受保护对象doInBackground(HashMap…hashMaps){
//非ui线程
hashMaps=hashMaps[0];
Set=maps.entrySet();
用于(对象集合:集合){
Map.Entry=(Map.Entry)aSet;
publishProgress(entry.getKey().toString());//onProgressUpdate回调
}
返回null;//onPostExecute回调
}
@凌驾
受保护的void onProgressUpdate(字符串…进度){
//用户界面线程
接收条形码(进度);
}
@凌驾
受保护的void onPostExecute(长结果){
//用户界面线程
}
}
有很好的文档,您可以在线阅读更多信息。在您的
AsyncTask
中重写onPostExecute()
方法并在那里执行UI操作
如果您真的想在
doInBackground()
方法中更改UI,那么您可以使用处理程序来执行该操作。在异步任务中重写onPostExecute()
方法,并在那里执行UI操作
如果您真的想在doInBackground()
方法中更改UI,那么您可以使用处理程序来执行此操作。receiveBarcode()中的内容是什么?您正在进行一些UI更新吗?将UI代码放入runOnUiThread()
receiveBarcode()中的内容?您正在进行一些UI更新吗?将UI代码放入runOnUiThread()
中这是正确的方法。在doInBackground方法中执行非Ui内容,并在其余三种方法中执行所有Ui更新内容。@Aaron不是doInBackground单独的线程,Ui线程用于显示进度并将繁重的任务留在后台线程上。@George是的,你应该做doInBackground
中认为繁重的事情,然后将最少的数据传递到onProgressUpdate
或onPostExecute
以更新UI,但请记住不要手动调用这些方法AsyncTask
是Android类中的一个,它允许您在后台单独的线程上执行任务,还可以将您带回UI线程。@Aaron当您说不要手动调用它们时,您的意思是什么?@George,文档中有。如果要在onProgressUpdate
中接收回调以执行UI更新,请在loadInBackground
中的某个位置调用publishProgress
。同样,如果要在onPostExecute
中接收回调,则必须等待loadInBackground
返回结果。这是正确的方法。在doInBackground方法中执行非Ui内容,并在其余三种方法中执行所有Ui更新内容。@Aaron不是doInBackground单独的线程,Ui线程用于显示进度并将繁重的任务留在后台线程上。@George是的,你应该做doInBackground
中认为繁重的事情,然后将最少的数据传递到onProgressUpdate
或onPostExecute
以更新UI,但请记住不要手动调用这些方法AsyncTask
是Android类中的一个,它允许您在后台单独的线程上执行任务,还可以将您带回UI线程。@Aaron当您说不要手动调用它们时,您的意思是什么?@George,文档中有。如果要在onProgressUpdate
中接收回调以执行UI更新,请在loadInBackground
中的某个位置调用publishProgress
。同样,如果您希望在onPostExecute
中接收回调,则必须等待loadInBackground
返回结果。