java - 异步任务无法访问原始线程

标签 java android android-asynctask

我已将代码移至异步任务以在后台线程上执行操作。代码如下:

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;
    }
}

但是,在运行代码库时。我遇到以下错误:

Process: com.touchsides.checkout.debug, PID: 7447
java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:309)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)
 Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6556)
    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:942)

我假设 doInbackground 正在单独的线程上运行,并且不应遇到此错误。

最佳答案

AsyncTask 中,您永远无法在 doInBackgound 中执行 UI 交互,但是如果您在 onProgressUpdate 中传递进度或结果,您仍然可以更新 UI > 和 onPostExecute 分别,这就是您重新获得 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
    }
}

AsyncTask有详细记录,您可以在线阅读更多相关信息。

关于java - 异步任务无法访问原始线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53221028/

相关文章:

java - 为什么我的 formdata.append 没有将键值对发送到服务器?

java - java中如何将最后一位数字0更改为1?

java - 如何确定最适合场景的设计模式

java - 是否有与 NSPredicate 等效的 java?

android - Google Currents 喜欢逐页阅读风格

android - 求行距的高度

android - 使用 AsyncTask 将图像加载到自定义适配器中

Android在网页字段中插入变量

安卓线程问题

android - java.lang.NullPointerException : Attempt to invoke interface method on a null object reference error on OnPostExecute() - AsyncTask 异常