2012-02-09 2 views
3

나는 RESTful 웹 서비스를 가지고 있으며 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) { 
} 
} 

나는 로그 캣이 스택 트레이스를 얻을 :

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 방법으로 텍스트를 변경하는 것이 할 수있는 좋은 장소가 아니다 액티비티 클래스에서 개인 클래스로 당신에게 AsyncTask를 클래스를 정의하는 것은

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); 

    } 
} 

당신이 정의하는 onPostExecute

노트에서 UI 스레드에 액세스 당신이 필요가 지속되는 어떤 네트워크 요청 또는 수행 할

+0

이제 문제가 생겼습니다 :'AndroidClient.apk를 'emulator-5554'디바이스에 설치하지 못했습니다! '왜? 그것은 단지 AVD를 시작하지 않을 것입니다 ... – Dragos

+0

새로운 질문을 올리십시오 – confucius

0

AsynTask를 사용하지 마십시오 당신의 AsyncTask를 정의에 String 수업을 위해 그것을 정의부터 onPostExecute에 대한 Long 매개 변수와 잘못 이잖아. 비동기 작업은 사용자의 작업과 밀접하게 연결되어 있으며 사용자가 응용 프로그램을 다시 작성한 후 화면의 방향을 변경하면 AsyncTask가 중지됩니다.

서비스 패턴을 의도 서비스 및 ResultReceiver와 함께 사용하는 것이 좋습니다. RESTDroid를 살펴보십시오. 그것은 모든 종류의 REST 요청을 비동기 적으로 수행하고 Virgil Dobjanschi의 서비스 패턴을 구현하는 요청 청취자와 함께 UI에 알릴 수있는 라이브러리입니다.

관련 문제