2017-04-18 7 views
0

私はAndroidのアプリケーションでHTTPコアとクライアントのjarファイルを使用しています。私はSDK 23で動作しています。 私はコンパイル時にエラーが発生していません。外部依存関係を使用して呼び出されます。私のアプリは実行時に追加された依存関係を使用していません

マイmainactivity.java

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import java.io.IOException; 
import java.net.URI; 
import java.net.URISyntaxException; 

import com.rallydev.rest.RallyRestApi; 
import com.rallydev.rest.request.QueryRequest; 
import com.rallydev.rest.response.QueryResponse; 

public class MainActivity extends AppCompatActivity 
{ 
    String host = "https://rally1.rallydev.com"; 


    String applicationName = "Android-Rally"; 
    RallyRestApi restApi; 
    Button buttonlogin; 
    EditText etemail,etpass; 
    QueryRequest qtestset; 
    QueryResponse response; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     etemail=(EditText) findViewById(R.id.etemail); 
     etpass=(EditText) findViewById(R.id.etpassword); 
     buttonlogin=(Button) findViewById(R.id.btnlogin); 
     buttonlogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       if(etemail.equals("") && etpass.equals("")) 
       { 
        Toast.makeText(getApplicationContext(),"Enter your Rally Credentials",Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        try 
        { 
         getRally(); 
        } 
        catch (URISyntaxException e) 
        { 
         e.printStackTrace(); 
        } 
        qtestset = new QueryRequest("Defects"); 
        qtestset.setLimit(1); 
        try 
        { 
         response = restApi.query(qtestset); 
         if(!response.wasSuccessful()) 
         { 
          Toast.makeText(getApplicationContext(),"Login Un-Successful",Toast.LENGTH_LONG).show(); 


         } 
         else{ 
          Toast.makeText(getApplicationContext(),"Login Successful",Toast.LENGTH_LONG).show(); 
         } 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 



       } 


      } 
     }); 

    } 

    public RallyRestApi getRally() throws URISyntaxException { 
     String password = etemail.getText().toString(); 
     String email=etpass.getText().toString(); 
     restApi = new RallyRestApi(new URI(host), email,password); 
     restApi.setApplicationName(applicationName); 
     return restApi; 
    } 
} 

マイアプリのGradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "22.0.1" 

    packagingOptions 
      { 
       exclude 'META-INF/DEPENDENCIES.txt' 
       exclude 'META-INF/DEPENDENCIES' 
       exclude 'META-INF/dependencies.txt' 
      } 


    defaultConfig { 
     applicationId "com.example.apetkar.rally_rest_android" 
     minSdkVersion 19 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies 
     { 
      compile fileTree(dir: 'libs', include: ['*.jar']) 
      testCompile 'junit:junit:4.12' 
      compile ('com.android.support:appcompat-v7:23.2.0') 
      compile files('libs/gson-2.2.4.jar') 
      compile files('libs/commons-logging-1.1.1.jar') 
      compile files('libs/httpcore-4.2.4.jar') 
      compile files('libs/httpclient-4.2.5.jar') 
      compile files('libs/rally-rest-api-2.2.1.jar') 

     } 

エラーログ

java.lang.NoSuchMethodError: No static method extractHost(Ljava/net/URI;)Lorg/apache/http/HttpHost; in class Lorg/apache/http/client/utils/URIUtils; or its super classes (declaration of 'org.apache.http.client.utils.URIUtils' appears in /system/framework/org.apache.http.legacy.boot.jar) 
                          at org.apache.http.impl.client.DecompressingHttpClient.getHttpHost(DecompressingHttpClient.java:113) 
                          at org.apache.http.impl.client.DecompressingHttpClient.execute(DecompressingHttpClient.java:108) 
                          at com.rallydev.rest.client.HttpClient.executeRequest(HttpClient.java:157) 
                          at com.rallydev.rest.client.HttpClient.doRequest(HttpClient.java:145) 
                          at com.rallydev.rest.client.BasicAuthClient.doRequest(BasicAuthClient.java:56) 
                          at com.rallydev.rest.client.HttpClient.doGet(HttpClient.java:221) 
                          at com.rallydev.rest.RallyRestApi.query(RallyRestApi.java:172) 
                          at com.example.apetkar.rally_rest_android.MainActivity$1.onClick(MainActivity.java:67) 
                          at android.view.View.performClick(View.java:5198) 
                          at android.view.View$PerformClick.run(View.java:21147) 
                          at android.os.Handler.handleCallback(Handler.java:739) 
                          at android.os.Handler.dispatchMessage(Handler.java:95) 
                          at android.os.Looper.loop(Looper.java:148) 
                          at android.app.ActivityThread.main(ActivityThread.java:5417) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 

私はこのissue.Theの問題に見えなかったアンドロイドのデフォルトorg.apache.http.client.utils.URIUtilsがあります実行時に呼び出され、メソッドの抽出ホストが含まれていません。メソッドextracthostはHttpClient.jar ..どのようにして、アプリケーションがデフォルトのアンドロイドクラスではなくJarのクラスを強制的に呼び出すことができますか?

+1

1)代わりにJARファイルと 'compile' gradle依存関係を使用しないでください。 2) 'fileTree(dir: 'libs')をコンパイルするのは分かりますか?もしそうなら、別々のJARをそれぞれ明示的にコンパイルする必要はありません。 –

+0

ええ。私はjarを右クリックし、コンパイルファイル(.jar)が追加されています。私はここで何を提案しますか?私はjarファイルを削除し、コンパイルするためのgradle依存関係を追加して戻します。 – Akshay

答えて

1

あなたは、Android

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

Simliarlyのために作られていない古いのApache HTTPクライアント...そして、もう一つを使用している、あなたは本当にJARファイルを必要としない、私は考えていません。

compile group: 'com.rallydev.rest', name: 'rally-rest-api', version: '2.2.1' 
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0' 
compile group: 'commons-logging', name: 'commons-logging', version: '1.2' 

私はデフォルトのアンドロイドのクラスに

をジャーでクラスを呼び出していないためにアプリを強制することができますどのように私はそのラリーのAPIライブラリは、Apache HTTPを必要とするかどうかわからないんだけど、IあなたがコンパイルしたものであるAndroid 23でApache HTTPが削除されたので、別のHTTPライブラリを提案するでしょう。したがって、コードはデフォルトクラスを呼び出すべきではありません。

+0

rallyrestapi依存関係をローカルでhttpclient-androidに変更しました。 java-rallyrestapiは以前にインポートしたhttp-clientとhttpcore上に構築されています。あなたの助けを歓迎します。 – Akshay

+0

また、メインスレッド上でネットワーク操作を実行できないことを恐れています。何もありません? – Akshay

+0

私は ' HTTPClientはメインスレッド上で動作すると思うが、VolleyやOkHTTPライブラリは良い選択肢である –

関連する問題