只有创建视图层次结构的原始线程才能触及它的视图 - Android

Only the original thread that created a view hierarchy can touch its views - Android

我正在使用 MultipartEntityBuilder 将图像发送到 php 服务器,我将照片和视频拍摄到设备相机到一个目录,我需要将文件保存在新的 ArrayList 上并将其发送到 php 服务器.

总是报错:

我的代码

private class MyAsyncTask extends AsyncTask<String, Integer, Double>
    {
        @Override
        protected Double doInBackground (String... params)
        {
            String datos = value.getText().toString();

            HttpClient httpClient = getNewHttpClient();

            HttpPost httppost = new HttpPost("https://myurl.com");

            try
            {

path = Environment.getExternalStorageDirectory().toString() + "/mydirectory";

                File fileArray = new File(path);
                ArrayList<File> files = new ArrayList<File>(Arrays.asList(fileArray.listFiles()));

                int itemCount = files.size();

                MultipartEntityBuilder builder = MultipartEntityBuilder.create();

                builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

                for (int i = 0; i < itemCount; i++)
                {
                    builder.addPart("images[]", new FileBody(new File(path + "/" + num_img)));
                    num_img++;
                }

                builder.addTextBody("response", "prueba");

                HttpEntity entity = builder.build();

                httppost.setEntity(entity);

    //...............................

}

更新

protected void onPostExecute (Double result)
        {
            path = Environment.getExternalStorageDirectory().toString() + "/myDirectory";


            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    File fileArray = new File(path);
                    ArrayList<File> files = new ArrayList<File>(Arrays.asList(fileArray.listFiles()));

                    int itemCount = files.size();
                    tv_files.setText("valor:" + itemCount);

                    MultipartEntityBuilder builder = MultipartEntityBuilder.create();

                    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

                    builder.addTextBody("response", "prueba");

                    for (int i = 0; i < itemCount; i++)
                    {
                        builder.addPart("images[]", new FileBody(new File(path + "/" + num_img)));
                        num_img++;
                    }

                    HttpEntity entity = builder.build();

                }
            });

此错误试图告诉您永远不要在 UIThread 上 运行 上的任何线程之外触摸 UI 视图。

在您的 DoInBackground 中,您正在尝试获取 EditText 的值,这正在考虑对线程中的 UI 视图进行触摸 运行 s 在后台。

解决方案: 移动以下行

String datos = value.getText().toString();

doInBackground 方法之外到 onPreExcute() 或在 AsyncTask 的构造函数上。只需在 AsyncTask 中将 String datos 声明为全局变量,然后根据需要在 doInBackground() 中使用它

    @Override
    protected void onPreExecute() {
       datos = value.getText().toString();
    }