簡體   English   中英

java.lang.NoSuchMethodError org.apache.http.client.utils.URLEncodedUtils.encPath

[英]java.lang.NoSuchMethodError org.apache.http.client.utils.URLEncodedUtils.encPath

我正在嘗試使用Apache HTTP Client庫在Android中發出GET請求,但是當我嘗試發出請求時,我得到了以下的堆棧跟蹤。

06-17 16:19:58.891  10605-10605/com.myapp.test.android E/SELinux﹕ selinux_android_seapp_context_reload: seapp_contexts file is loaded from /data/security/spota/seapp_contexts
06-17 16:19:58.891  10605-10605/com.myapp.test.android D/dalvikvm﹕ Late-enabling CheckJNI
06-17 16:19:59.001  10605-10605/com.myapp.test.android I/dalvikvm﹕ Could not find method org.apache.http.client.utils.URLEncodedUtils.encPath, referenced from method org.apache.http.client.utils.URIBuilder.encodePath
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm﹕ VFY: unable to resolve static method 2455: Lorg/apache/http/client/utils/URLEncodedUtils;.encPath (Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String;
06-17 16:19:59.001  10605-10605/com.myapp.test.android D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.android I/dalvikvm﹕ Could not find method org.apache.http.client.utils.URLEncodedUtils.encUric, referenced from method org.apache.http.client.utils.URIBuilder.encodeUric
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm﹕ VFY: unable to resolve static method 2456: Lorg/apache/http/client/utils/URLEncodedUtils;.encUric (Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String;
06-17 16:19:59.001  10605-10605/com.myapp.test.android D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.android I/dalvikvm﹕ Could not find method org.apache.http.client.utils.URLEncodedUtils.format, referenced from method org.apache.http.client.utils.URIBuilder.encodeUrlForm
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm﹕ VFY: unable to resolve static method 2461: Lorg/apache/http/client/utils/URLEncodedUtils;.format (Ljava/lang/Iterable;Ljava/nio/charset/Charset;)Ljava/lang/String;
06-17 16:19:59.001  10605-10605/com.myapp.test.android D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.android I/dalvikvm﹕ Could not find method org.apache.http.client.utils.URLEncodedUtils.encUserInfo, referenced from method org.apache.http.client.utils.URIBuilder.encodeUserInfo
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm﹕ VFY: unable to resolve static method 2457: Lorg/apache/http/client/utils/URLEncodedUtils;.encUserInfo (Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String;
06-17 16:19:59.001  10605-10605/com.myapp.test.android D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.android I/dalvikvm﹕ Could not find method org.apache.http.client.utils.URLEncodedUtils.parse, referenced from method org.apache.http.client.utils.URIBuilder.parseQuery
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm﹕ VFY: unable to resolve static method 2465: Lorg/apache/http/client/utils/URLEncodedUtils;.parse (Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/util/List;
06-17 16:19:59.001  10605-10605/com.myapp.test.android D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0008
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm﹕ Exception Ljava/lang/NoSuchMethodError; thrown while initializing Lcom/myapp/test/android/IHeart;
06-17 16:19:59.001  10605-10605/com.myapp.test.android D/AndroidRuntime﹕ Shutting down VM
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41849898)
06-17 16:19:59.001  10605-10605/com.myapp.test.android E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NoSuchMethodError: org.apache.http.client.utils.URLEncodedUtils.encPath
            at org.apache.http.client.utils.URIBuilder.encodePath(URIBuilder.java:175)
            at org.apache.http.client.utils.URIBuilder.buildString(URIBuilder.java:136)
            at org.apache.http.client.utils.URIBuilder.build(URIBuilder.java:104)
            at com.myapp.test.android.IHeart.makeGetRequest(IHeart.java:129)
            at com.myapp.test.android.IHeart.getMarketId(IHeart.java:119)
            at com.myapp.test.android.IHeart.setMarketId(IHeart.java:70)
            at com.myapp.test.android.IHeart.initializeIHeart(IHeart.java:60)
            at com.myapp.test.android.IHeart.<init>(IHeart.java:50)
            at com.myapp.test.android.IHeart.<clinit>(IHeart.java:35)
            at com.myapp.test.android.MainActivity.onCreate(MainActivity.java:21)
            at android.app.Activity.performCreate(Activity.java:5369)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2348)
            at android.app.ActivityThread.access$700(ActivityThread.java:159)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5414)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
            at dalvik.system.NativeStart.main(Native Method)

所以看起來應用程序在嘗試在我的代碼中創建URI對象時崩潰了。 特別是,當它試圖解析.setPath(path)代碼片段時。

// Make the GET request and get the response JSON.
return makeGetRequest(
        SCHEME,
        HOST,
        PATH_MARKET,
        params
);
...
private JSONObject makeGetRequest(String scheme, String host, String path, List<NameValuePair> params) {
        try {
            URI uri = new URIBuilder()
                    .setScheme(scheme)
                    .setHost(host)
                    .setPath(path)  // <-- Where the crash is happening!
                    .setParameters(params)
                    .build();

這是我的代碼的樣子。

MainActivity.java

公共類MainActivity擴展Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    IHeart.getInstance();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(com.myapp.test.android.R.menu.main, menu);
    return true;
}

}

IHeart.java

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.util.Log;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;

public class IHeart {

    private static final String TAG = IHeart.class.getSimpleName();
    private static IHeart instance = new IHeart();

    private static final String SCHEME = "https";
    private static final String HOST = "api2.iheart.com";
    private static final String PATH_MARKET = "/api/v2/content/markets";

    private long mMarketId;

    public static IHeart getInstance() {
        return instance;
    }

    private IHeart() {
        initializeIHeart();
    }

    private void initializeIHeart() {
        setMarketId();
    }

    private void setMarketId() {
        try {
            JSONObject response = getMarketId("40.7127837", "-74.005941");

            if (response != null) {

                final String KEY_HITS = "hits";
                final String KEY_MARKET_ID = "marketId";

                if (response.isNull(KEY_HITS)) {
                    Log.e(TAG, KEY_HITS + " key doesn't exist in response JSON.");
                } else {
                    JSONArray hitsArray = response.getJSONArray(KEY_HITS);

                    if (hitsArray == null || hitsArray.length() == 0 || hitsArray.isNull(0)) {
                        Log.d(TAG, "Hits array is null/empty.");
                    } else {
                        JSONObject firstHitsObject = hitsArray.getJSONObject(0);

                        if (firstHitsObject == null || firstHitsObject.isNull(KEY_MARKET_ID)) {
                            Log.d(TAG, "Market ID value is null/empty/missing in JSON.");
                        } else {
                            mMarketId = firstHitsObject.getInt(KEY_MARKET_ID);
                            Log.d(TAG, "Market ID = " + mMarketId);
                        }

                    }
                }

            } else {
                Log.e(TAG, "Response JSON was null.");
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private JSONObject getMarketId(String latitude, String longitude) throws JSONException {

        // Define the params
        ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("limit", "10"));
        params.add(new BasicNameValuePair("lat", latitude));
        params.add(new BasicNameValuePair("lng", longitude));

        // Make the GET request and get the response JSON.
        return makeGetRequest(
                SCHEME,
                HOST,
                PATH_MARKET,
                params
        );
    }

    private JSONObject makeGetRequest(String scheme, String host, String path, List<NameValuePair> params) {
        try {
            URI uri = new URIBuilder()
                    .setScheme(scheme)
                    .setHost(host)
                    .setPath(path)
                    .setParameters(params)
                    .build();

            Log.d(TAG, "URI = " + uri);

            // Make asyn REST call and return resulting in JSON.
            return new getRequestTask().execute(uri).get();

        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return null;
    }

    private class getRequestTask extends AsyncTask<URI, Void, JSONObject> {

        @Override
        protected JSONObject doInBackground(URI... params) {
            for (URI uri : params) {
                try {
                    CloseableHttpClient httpClient = HttpClients.createDefault();
                    HttpGet httpGet = new HttpGet(uri);

                    CloseableHttpResponse response = httpClient.execute(httpGet);

                    // Read the response
                    HttpEntity httpEntity = response.getEntity();

                    // Create and return JSONObject
                    if (httpEntity != null) {
                        String json = EntityUtils.toString(httpEntity);
                        return new JSONObject(json);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            return null;
        }
    }
}

我創建了另一個項目,但這次是作為Java應用程序,並且能夠很好地執行此代碼。 特別是,當Java應用程序像在Android應用程序中那樣點擊下面的代碼時,它並沒有崩潰。

// Make the GET request and get the response JSON.
return makeGetRequest(
        SCHEME,
        HOST,
        PATH_MARKET,
        params
);

我通過Android項目構建時也沒有編譯錯誤。 我實際上能夠運行應用程序,但它立即崩潰。

任何指針都將非常感激。

如果它有幫助,這是我對Apache HTTP客戶端的Maven依賴:

的pom.xml

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3.4</version>
</dependency>

Android在其SDK中包含過時的Apache HttpClient實現,如果您添加較新的Apache Http Client,則會使其發生沖突

您應該使用HttpClient for Android

谷歌Android 1.0發布了Apache HttpClient的BETA前快照。 為了配合第一個Android版本,Apache HttpClient 4.0 API必須過早凍結,而許多接口和內部結構仍未完全解決。 [...]用於Android的Apache HttpClient 4.3端口旨在通過提供與Google Android兼容的官方版本來解決這種情況。

使用此gradle依賴關系配置:

dependencies {
    /* ... */
    compile 'org.apache.httpcomponents:httpclient-android:4.3.3'
}

我不是maven用戶,但是maven配置應該是這樣的

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient-android</artifactId>
    <version>4.3.3</version>
</dependency>

你真的想使用4.3.3因為4.3.4的android端口還沒有。

要調用HTTP方法,請稍微更改您的代碼(注意HttpGetHC4

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGetHC4 httpGet = new HttpGetHC4(url);
CloseableHttpResponse response = httpClient.execute(httpGet);

它使用URIBuilder不同實現,因此客戶端代碼無需更改。

對於java,只需將http庫的順序更改為最高位置。

在為API 23構建時,使用Apache的舊庫時可能會收到“無法解析”消息

dependencies {
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

相反,使用Apache的Android新庫

dependencies {
    compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1'
}

如果仍然出現錯誤,可以從Maven倉庫下載jar:

http://mvnrepository.com/artifact/cz.msebera.android/httpclient/4.4.1.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM