2012-02-09 11 views
3

私はRESTful Webサービスを持っており、Androidからアクセスしたいと考えています。Android RESTfulクライアント

public class AndroidClientActivity extends Activity { 

private EditText text; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    text = (EditText) findViewById(R.id.editText1); 
} 

public void myClickHandler(View view){ 
    switch (view.getId()) { 
    case R.id.button1: 
     MyClient c = new MyClient(); 
     c.execute(text); 
     break; 
    } 

} 
} 


public class MyClient extends AsyncTask<EditText, Integer, String> { 

protected String doInBackground(EditText... strings) { 

     WebResource wbr; 
     Client client = Client.create(); 
     wbr = client.resource("http://my.ip.address:8080/MazeService/rest/service/hello"); 
     String result = wbr.queryParam("number", "10").accept(MediaType.APPLICATION_JSON).get(String.class); 
     strings[0].setText(result); 
    return result; 
} 

protected void onProgressUpdate(Integer... progress) { 
} 

protected void onPostExecute(Long result) { 
} 
} 

私はLogCatでこのスタックトレースを取得する:

02-09 00:06:38.593: E/AndroidRuntime(795): Caused by: java.lang.NullPointerException 
02-09 00:06:38.593: E/AndroidRuntime(795): at javax.ws.rs.core.MediaType.valueOf(MediaType.java:119) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.ClientResponse.getType(ClientResponse.java:615) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:532) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:506) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.WebResource.handle(WebResource.java:674) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.maze.client.MyClient.doInBackground(MyClient.java:19) 
02-09 00:06:38.593: E/AndroidRuntime(795): at com.maze.client.MyClient.doInBackground(MyClient.java:1) 
02-09 00:06:38.593: E/AndroidRuntime(795): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
02-09 00:06:38.593: E/AndroidRuntime(795): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-09 00:06:38.593: E/AndroidRuntime(795): ... 5 more 

どこに問題がありますか?

+0

'result'をクラスprivateフィールドに置き、' onPostExecute'メソッドでEditBoxを更新します。 –

答えて

4

私はあなたがdoInBackgroundメソッドからUIスレッドにアクセスしようとしていると思うと、それは代わりに、あなたが安全に、最初にこの

ようなUIスレッドにアクセスすることができ、このようなonPostExecute方法でテキストを変更することを行うには良い場所ではありませんそして、あなたが定義しているonPostExecute

ノートからUIスレッドにアクセス

private class MyClient extends AsyncTask<EditText, Void, String> { 

protected String doInBackground(EditText... strings) { 

     WebResource wbr; 
     Client client = Client.create(); 
     wbr = client.resource("http://my.ip.address:8080/MazeService/rest/service/hello"); 
     String result = wbr.queryParam("number", "10").accept(MediaType.APPLICATION_JSON).get(String.class); 

    return result; 
} 
    protected void onPostExecute(String result) { 
    if(result != null) 
    text.setText(result); 

    } 
} 

あなたのActivityクラスにプライベートクラスとしてあなたにAsyncTaskクラスを定義あなたはその必要性を永続化するためにどのようなネットワーク要求かを実行するために

+0

OK、別の問題があります: 'AndroidClient.apkを 'emulator-5554'デバイスにインストールできませんでした!なぜですか?それは単にAVDを起動しません... – Dragos

+0

新しい質問を投稿してください – confucius

0

AsynTaskを使用しないでください、あなたのAsyncTask定義でStringクラスを取るために、それを定義するため、onPostExecuteためLongパラメータとは間違ってthatsの。非同期タスクはあなたのアクティビティに強く結びついており、アプリケーションの再作成後にユーザーが画面の向きを変更すると、AsyncTaskが停止します。

Intent ServiceとResultReceiverでServiceパターンを使用することをお勧めします。 RESTDroidを見てみましょう。これは、あらゆる種類のRESTリクエストを非同期的に実行し、Virgil Dobjanschiのサービスパターンを実装しているリクエストリスナでUIに通知するためのライブラリです。