【问题标题】:POST json and image to server androidPOST json 和图像到服务器 android
【发布时间】:2016-12-14 14:06:23
【问题描述】:

我尝试使用 android 将 JSON 和图像文件发布到服务器。

class TaskUploadPic extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... strings) {

        try {
            MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
            multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            multipartEntity.addTextBody("json", strings[0]);
            multipartEntity.addPart("image", new FileBody(file));

            HttpClient httpclient = new DefaultHttpClient();

            httpclient.getConnectionManager().closeExpiredConnections();
            HttpPost httppost = new HttpPost(serverURL);
            httppost.setEntity(multipartEntity.build());

            HttpResponse response = httpclient.execute(httppost);

            return EntityUtils.toString(response.getEntity());
        } catch (IOException ex) {
            Log.wtf("upload", ex.getMessage());
        }

        return "null";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        text.setText(result);
    }
}

似乎一切正常,但执行该 AsyncTask 后,出现错误:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
              Process: ru.kit.automart, PID: 30631
              java.lang.RuntimeException: An error occured while executing doInBackground()
                  at android.os.AsyncTask$3.done(AsyncTask.java:304)
                  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                  at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                  at java.lang.Thread.run(Thread.java:818)
               Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/entity/ContentType;
                  at org.apache.http.entity.mime.MultipartEntityBuilder.addTextBody(MultipartEntityBuilder.java:158)
                  at ru.kit.automart.UploadPicActivity$TaskUploadPic.doInBackground(UploadPicActivity.java:189)
                  at ru.kit.automart.UploadPicActivity$TaskUploadPic.doInBackground(UploadPicActivity.java:181)
                  at android.os.AsyncTask$2.call(AsyncTask.java:292)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                  at java.lang.Thread.run(Thread.java:818) 
               Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.entity.ContentType" on path: DexPathList[[dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-support-annotations-24.1.1_7604d2381e39dd02ef461f537f961dbb4e9625b6-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-internal_impl-24.1.1_6ad3c734c630b0da8f77be30b148d6bf343c3efb-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-httpmime-4.5.2_bf26247ce9bf36f977d3bfba701b9635500c22f3-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-com.github.pinball83-masked-edittext-1.0.3_0e8a6c65b0351a310754f26167cf476680872fd3-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-com.android.support-support-vector-drawable-24.1.1_a5171778b8b856af5acc9b46463816a13d8e94bf-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-com.android.support-support-v4-24.1.1_a349006ec815f9d626f1bdbf50fa1e0dd886c0dc-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-com.android.support-recyclerview-v7-24.1.1_6efa576f7ec7ebc0253c8e8605405e1d336e7cc4-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-com.android.support-design-24.1.1_5d630f1067696b166c4402c2202dd3ac771538b2-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-com.android.support-appcompat-v7-24.1.1_30616bdd58d9fd5e43c2d1a2845438888bdccd13-classes.dex", dex file "/data/data/ru.kit.automart/files/instant-run/dex/slice-com.android.support-animated-vector-drawable-24.1.1_a57732f7c118f52713147bd5067abd84c1b5de5e-classes.dex"],nativeLibraryDirectories=[/data/app/ru.kit.automart-1/lib/arm64, /vendor/lib64, /system/lib64, /vendor/lib64, /system/lib64]]
                  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                at com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader.findClass(IncrementalClassLoade

我做错了什么? 我在 StackOverflow 上阅读了很多主题,但对我没有帮助。

gradle 文件中的依赖项:

dependencies {
// ...
    compile 'org.apache.httpcomponents:httpclient:4.5.2'
    compile 'org.apache.httpcomponents:httpmime:4.5.2'
}

【问题讨论】:

  • 好像找不到需要的Java类Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.entity.ContentType"

标签: java android json post


【解决方案1】:

org.apache.http.entity.ContentTypehttpcore 中可用,因此您需要包含compile 'org.apache.httpcomponents:httpcore:4.4.5'

dependencies {
    // ...
    compile 'org.apache.httpcomponents:httpclient:4.5.2'
    compile 'org.apache.httpcomponents:httpmime:4.5.2'
    compile 'org.apache.httpcomponents:httpcore:4.4.5' // Include this
}

【讨论】:

  • 我已经试过了。项目构建期间发生错误:错误:任务':app:transformResourcesWithMergeJavaResForDebug'的执行失败。 > com.android.build.api.transform.TransformException:com.android.builder.packaging.DuplicateFileException:在 APK META-INF/LICENSE File1 中复制的重复文件:.gradle\caches\modules-2\files-2.1\org。 apache.httpcomponents\httpcore\4.4.5\...\httpcore-4.4.5.jar 文件2:.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpmime\4.5.2\.. .\httpmime-4.5.2.jar
  • 您是否尝试在packagingOptions 中排除'META-INF/LICENSE'? (见stackoverflow.com/a/34039265/3473158
  • 我还添加了排除 'META-INF/DEPENDENCIES' 并且它有效。谢谢!
猜你喜欢
  • 2016-07-26
  • 1970-01-01
  • 2014-07-13
  • 2014-04-07
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多