有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 java。lang.NoSuchMethodError org。阿帕奇。http。客户乌提尔斯。我是杜提尔。encPath

我试图在Android中使用ApacheHTTP客户端库发出GET请求,但在尝试发出请求时,我得到了以下堆栈跟踪

06-17 16:19:58.891  10605-10605/com.myapp.test.安卓 E/SELinux﹕ selinux_安卓_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.安卓 D/dalvikvm﹕ Late-enabling CheckJNI
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 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.安卓 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.安卓 D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 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.安卓 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.安卓 D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 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.安卓 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.安卓 D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 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.安卓 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.安卓 D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 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.安卓 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.安卓 D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0008
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 W/dalvikvm﹕ Exception Ljava/lang/NoSuchMethodError; thrown while initializing Lcom/myapp/test/安卓/IHeart;
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 D/AndroidRuntime﹕ Shutting down VM
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41849898)
06-17 16:19:59.001  10605-10605/com.myapp.test.安卓 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.安卓.IHeart.makeGetRequest(IHeart.java:129)
            at com.myapp.test.安卓.IHeart.getMarketId(IHeart.java:119)
            at com.myapp.test.安卓.IHeart.setMarketId(IHeart.java:70)
            at com.myapp.test.安卓.IHeart.initializeIHeart(IHeart.java:60)
            at com.myapp.test.安卓.IHeart.<init>(IHeart.java:50)
            at com.myapp.test.安卓.IHeart.<clinit>(IHeart.java:35)
            at com.myapp.test.安卓.MainActivity.onCreate(MainActivity.java:21)
            at 安卓.app.Activity.performCreate(Activity.java:5369)
            at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
            at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
            at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2348)
            at 安卓.app.ActivityThread.access$700(ActivityThread.java:159)
            at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
            at 安卓.os.Handler.dispatchMessage(Handler.java:99)
            at 安卓.os.Looper.loop(Looper.java:137)
            at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
            at com.安卓.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();

下面是我的代码

主要活动。java

公共类MainActivity扩展了活动{

@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.安卓.R.menu.main, menu);
    return true;
}

}

我感觉。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 安卓.os.AsyncTask;
import 安卓.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>

共 (3) 个答案

  1. # 1 楼答案

    Android在其SDK中包含过时的Apache HttpClient实现 如果添加较新的ApacheHTTP客户端,则会发生冲突

    你应该改用HttpClient for Android

    Google Android 1.0 was released with a pre-BETA snapshot of Apache HttpClient. To coincide with the first Android release Apache HttpClient 4.0 APIs had to be frozen prematurely, while many of interfaces and internal structures were still not fully worked out. [...] Apache HttpClient 4.3 port for Android is intended to remedy the situation by providing official releases compatible with Google Android.

    使用此渐变依赖项配置:

    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实现,所以客户端代码不需要更改

  2. # 2 楼答案

    对于java,只需将http库的顺序更改为最高位置