[英]Exception in thread “Thread-3” java.lang.NoSuchMethodError: org.apache.http.impl.client.DefaultRedirectStrategy.<init>([Ljava/lang/String;)V
[英]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,則會使其發生沖突
谷歌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.