Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步任务无法访问原始线程_Java_Android_Android Asynctask - Fatal编程技术网

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
返回结果。