Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.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
android.view.ViewRootImpl$CalledFromErrorThreadException_Android - Fatal编程技术网

android.view.ViewRootImpl$CalledFromErrorThreadException

android.view.ViewRootImpl$CalledFromErrorThreadException,android,Android,我已经在listview中显示了进度条,显示了网页的下载百分比 for(int i=0;i< 5;i++) { new UploadTask(i).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "http://www.google.com"); } 如何解决此错误?您不应该覆盖publishProgress()-您应该覆盖onProgressUpdate(),它从publishP

我已经在listview中显示了进度条,显示了网页的下载百分比

for(int i=0;i< 5;i++)
        {
            new UploadTask(i).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "http://www.google.com");
        }

如何解决此错误?

您不应该覆盖
publishProgress()
-您应该覆盖
onProgressUpdate()
,它从
publishProgress()
接收数据,但在UI线程上运行

@Override
protected void onPreExecute() {
  super.onPreExecute();
  //do you bg work here

  publishProgress(null);

  //do you bg work here
}

@Override
protected void onProgressUpdate(Void... values) {
 super.onProgressUpdate(values);
 //update UI here
}

请注意,当前您的异步任务没有正确定义。您的输入和输出实际上都是
字符串
,但您的进度更新是
整数
,这意味着您应该扩展
异步任务

,您不能在后台线程上更改UI。尝试使用
onProgressUpdate(对象…值)
AsyncTask方法,它会在UI线程上触发

@Override
protected void onPreExecute() {
  super.onPreExecute();
  //do you bg work here

  publishProgress(null);

  //do you bg work here
}

@Override
protected void onProgressUpdate(Void... values) {
 super.onProgressUpdate(values);
 //update UI here
}
您的代码应该如下所示:

  public class UploadTask extends AsyncTask<String, Integer, String>
    {
        int id;
        public UploadTask(int id) {
            this.id = id;
        }
        @Override
        protected String doInBackground(String... params) {
            try {
                return HttpUrlConnection.getContentFromUrl(params[0], listener);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return "";
            }
        }
        HttpListener listener = new HttpListener() {

            @Override
            public void processCompletion(int x) {
                publishProgress(x);
            }
        };

        @Override
        protected void onProgressUpdate(Integer... values) {
            progressLevelList.set(id, ints[0]);
            uploadAdapter.notifyDataSetChanged();
        }

    }
公共类UploadTask扩展了AsyncTask
{
int-id;
公共上载任务(int-id){
this.id=id;
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
返回HttpUrlConnection.getContentFromUrl(参数[0],侦听器);
}捕获(不支持的编码异常e){
e、 printStackTrace();
返回“”;
}
}
HttpListener=新的HttpListener(){
@凌驾
公共作废处理完成(int x){
出版进度(x);
}
};
@凌驾
受保护的void onProgressUpdate(整型…值){
progressLevelList.set(id,int[0]);
uploadAdapter.notifyDataSetChanged();
}
}

我们只能从通常称为UI线程的主线程更改UI。我们不能在后台线程上更改UI。您应该重写onProgressUpdate(),它从publishProgress()接收数据,但在UI线程上运行。

更改
AsyncTask
而不是
AsyncTask

@Override
protected void onPreExecute() {
  super.onPreExecute();
  //do you bg work here

  publishProgress(null);

  //do you bg work here
}

@Override
protected void onProgressUpdate(Void... values) {
 super.onProgressUpdate(values);
 //update UI here
}

改变

@Override
    public void onProgressUpdate(Integer... ints) {
            progressLevelList.set(id, ints[0]);
            uploadAdapter.notifyDataSetChanged();
        }
而不是

public void publishProgress(Integer... ints) {
            progressLevelList.set(id, ints[0]);
            uploadAdapter.notifyDataSetChanged();
        }