2012-02-09 175 views
3

我有一个REST风格的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'放入类专用字段中,并更新'onPostExecute'方法中的EditBox。 – 2012-02-09 02:09:09

回答

4

我认为你正试图从doInBackground方法访问UI线程,它不这样做,而不是改变文本的onPostExecute方法这样你就可以安全地访问UI线程这样

第一的好地方定义你的AsyncTask类作为一个私有类在你的Activity类

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线程因为你定义它采取String类在你的AsyncTask定义

+0

好的,现在我有另一个问题了:'在设备'emulator-5554上安装AndroidClient.apk失败!'为什么?它根本不会启动AVD ... – Dragos 2012-02-09 10:46:01

+0

请考虑发布新问题 – confucius 2012-02-09 10:47:11

0

切勿使用AsynTask执行网络请求或什么是需要被保留Long参数为onPostExecute并且那是错误的。异步任务与您的活动紧密相关,并且如果用户在创建应用程序后更改屏幕的方向,则AsyncTask将会停止。

我建议你在Intent Service和ResultReceiver中使用Service模式。看看RESTDroid。它是一个库,允许您异步执行任何类型的REST请求,并通过实现Virgil Dobjanschi服务模式的请求侦听器来通知您的UI。