【问题标题】:Only the original thread that created a view hierarchy can touch its views - Android只有创建视图层次结构的原始线程才能触摸其视图 - Android
【发布时间】:2015-05-22 06:20:28
【问题描述】:

我正在使用 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();

                }
            });

【问题讨论】:

  • 在后台线程中进行 ui 操作(访问视图)。还将此 value.getText().toString(); 作为参数传递给 asynctask
  • runOnUiThread()@Raghunandan?
  • 我会在onPreExecuteonPostExecute做与ui相关的操作。
  • 是的,runOnUiThread() 会做
  • 好的,谢谢,我会努力写的

标签: java android multipartentity


【解决方案1】:

这个错误是想告诉你永远不要触摸在UIThread 上运行的任何线程之外的 UI 视图。

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

解决方案: 移动下一行

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

doInBackground 方法之外的onPreExcute()AsyncTask 的构造函数。只需在 AsyncTask 中将 String datos 声明为全局变量,然后在您的 doInBackground() 中随意使用它

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

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多