被称为从AsyncTask的错误的线程异常 [英] Called From Wrong Thread Exception with AsyncTask

查看:154
本文介绍了被称为从AsyncTask的错误的线程异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不断收到即使我把它扔进的AsyncTask的doInBackground方法一CalledFromWrongThreadException!谁能告诉我,为什么,以及如何解决它?

  / **
     *确认在responseTexts关键词并运行相应的功能
     * @参数的responseText
     * /
    私人无效ResponseHandler所(字符串的responseText){
        如果(responseText.startsWith(注意事项,0)){
            notes.add(responseText的);
            新DownloadFilesTask()执行(WriteInternal,NULL,NULL);
        }
    }

这是我的AsyncTask类

 私有类DownloadFilesTask扩展的AsyncTask<弦乐,太虚,字符串> {
    保护字符串doInBackground(字符串...命令){
    如果(指令[0] .equals(WriteInternal){
        //写内部存储
    FileOutputStream中FOUT = NULL;
    OutputStreamWriter OSW = NULL;
    尝试{
        FOUT = openFileOutput(notes.txt,Context.MODE_PRIVATE);
        OSW =新OutputStreamWriter(FOUT);
        的for(int i = 0; I< notes.size();我++){
            osw.write(notes.get(ⅰ)+\\ n);
        }
        osw.close();
        fOut.close();
    }赶上(例外五){
        e.printStackTrace(System.err的);
    }    notesListView.setAdapter(arrayAdapter); //刷新列表视图       }
其他{
        sendCommand(命令[0]);
        返回null;
}
    }    保护无效onProgressUpdate(无效...进度){}
    保护无效onPostExecute(字符串结果){}
}

下面是我得到的堆栈跟踪:

  05-22 15:14:20.370:E / AndroidRuntime(11730):致命异常:AsyncTask的#2
05-22 15:14:20.370:E / AndroidRuntime(11730):了java.lang.RuntimeException:执行doInBackground发生错误()
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.os.AsyncTask $ 3.done(AsyncTask.java:278)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:273)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:307)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:208)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:569)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.lang.Thread.run(Thread.java:856)
05-22 15:14:20.370:E / AndroidRuntime(11730):$ android.view.ViewRootImpl CalledFromWrongThreadException:只有创建视图层次可以触摸其观点原来的线程所致。
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:722)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:771)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.view.ViewGroup.invalidateChild(ViewGroup.java:4005)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.view.View.invalidate(View.java:8576)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.view.View.invalidate(View.java:8527)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.widget.AbsListView.resetList(AbsListView.java:1734)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.widget.ListView.resetList(ListView.java:502)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.widget.ListView.setAdapter(ListView.java:442)
05-22 15:14:20.370:E / AndroidRuntime(11730):在com.nelson.jarvisclientics.Notes $ DownloadFilesTask.doInBackground(Notes.java:281)
05-22 15:14:20.370:E / AndroidRuntime(11730):在com.nelson.jarvisclientics.Notes $ DownloadFilesTask.doInBackground(Notes.java:1)
05-22 15:14:20.370:E / AndroidRuntime(11730):在android.os.AsyncTask $ 2.call(AsyncTask.java:264)
05-22 15:14:20.370:E / AndroidRuntime(11730):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
05-22 15:14:20.370:E / AndroidRuntime(11730):... 5个


解决方案

试着用 runOnUIThread包装您的文件访问code(新的Runnable {/ * code到这里* /}( ))

I keep getting a CalledFromWrongThreadException even if i throw it into AsyncTask's DoInBackground method! Can anyone tell me why and how to fix it?

/**
     * Recognizes key words in responseTexts and runs the appropriate function
     * @param responseText
     */
    private void responseHandler(String responseText) {
        if(responseText.startsWith("Notes", 0)) {
            notes.add(responseText);
            new DownloadFilesTask().execute("WriteInternal" , null, null);
        }
    }

this is my AsyncTask class

private class DownloadFilesTask extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... command) {
    if(command[0].equals("WriteInternal") {
        //write to internal storage
    FileOutputStream fOut = null;
    OutputStreamWriter osw = null;
    try{
        fOut = openFileOutput("notes.txt", Context.MODE_PRIVATE);
        osw = new OutputStreamWriter(fOut);
        for (int i = 0; i < notes.size(); i++){
            osw.write(notes.get(i) + "\n");
        }
        osw.close();
        fOut.close();
    } catch(Exception e) {
        e.printStackTrace(System.err);
    }

    notesListView.setAdapter(arrayAdapter);  //refreshes the listView

       }
else {
        sendCommand(command[0]);
        return null;
}
    }

    protected void onProgressUpdate(Void... progress) {}
    protected void onPostExecute(String result) {}
}

Here's the stacktrace I got:

05-22 15:14:20.370: E/AndroidRuntime(11730): FATAL EXCEPTION: AsyncTask #2
05-22 15:14:20.370: E/AndroidRuntime(11730): java.lang.RuntimeException: An error occured while executing doInBackground()
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.lang.Thread.run(Thread.java:856)
05-22 15:14:20.370: E/AndroidRuntime(11730): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:722)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:771)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:4005)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.view.View.invalidate(View.java:8576)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.view.View.invalidate(View.java:8527)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.widget.AbsListView.resetList(AbsListView.java:1734)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.widget.ListView.resetList(ListView.java:502)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.widget.ListView.setAdapter(ListView.java:442)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at com.nelson.jarvisclientics.Notes$DownloadFilesTask.doInBackground(Notes.java:281)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at com.nelson.jarvisclientics.Notes$DownloadFilesTask.doInBackground(Notes.java:1)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-22 15:14:20.370: E/AndroidRuntime(11730):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-22 15:14:20.370: E/AndroidRuntime(11730):    ... 5 more

解决方案

Try wrapping your file access code with runOnUIThread(new Runnable{/*code goes here*/}())

这篇关于被称为从AsyncTask的错误的线程异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆