我需要一点手握住从C#转换到Java / Android,以便客户端使用Web服务同步,因此它不会锁定gui ....(进度条会锦上添花。 )在C#中,我会在客户端创建对象做这样的事情。
创建服务参考。 创建一个与服务接口成员匹配的对象并填充。 在单独的线程中启动在第二步中创建的服务请求传递对象。 等待显示进度条。 处理错误或返回数据的响应。
现在也许我太简单了,但我认为在Java中它会非常接近这种方法。我所看到的是很多人说要扩展AsyncTask类。我缺少的是我如何从客户传递我的价值观?例如,如何发送用户名和密码?我担心所有不同的文章和细微差别让我感到困惑。我只需要一种直接的方式来完成工作。
所以我会感激任何提示,指针,教程或其他此类阅读。
JB
答案 0 :(得分:1)
异步任务带来了很多问题,因为它们托管的活动可能会在执行仍在进行时被销毁。
最好的方法是在intentservice或服务内部托管请求,该请求将在请求活动中生效。
如果您想要一个开箱即用的解决方案,我建议您查看robospice库,这是一个非常成熟的项目。它基于此Google Io 2010 talk
答案 1 :(得分:1)
public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String> {
private final String serviceUrl = "URL HERE";
String user;
String pass;
public AsyncHttpRequestManager(String user, String Pass){
this.user = user;
this.pass = pass;
}
@Override
protected String doInBackground(String... params) {
//execute the post
return "";
}
protected void onPostExecute(String result) {
Log.d("MESSAGE", result);
//update the UI with the results
}
}
然后使用
执行调用new AsyncHttpRequestManager(user, pass).execute();
答案 2 :(得分:0)
6个月前,我开始使用C#/ .NET的背景进行Android开发
我们当前使用的第一个选项是AsyncTask来执行异步任务...在这种情况下正在使用Web服务......
示例代码是
public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String> {
private final String serviceUrl = "URL HERE";
@Override
protected String doInBackground(String... params) {
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpPut putRequest = new HttpPut(serviceUrl);
putRequest.setHeader("Content-type", "text/plain");
putRequest.setHeader("Accept", "text/plain");
putRequest.setEntity(new StringEntity(params[0]));
HttpResponse response = client.execute(putRequest);
InputStream content = response.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
String result = "";
String s = "";
while ((s = buffer.readLine()) != null) {
result += s;
}
return result;
}
catch (UnsupportedEncodingException e) {
Log.e("AsyncOperationFailed", e.getMessage());
e.printStackTrace();
} catch (ClientProtocolException e) {
Log.e("AsyncOperationFailed", e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.e("AsyncOperationFailed", e.getMessage());
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
Log.d("MESSAGE", result);
}
}
我已经写了blog post。
进一步显示进度/加载对话框,您可能必须覆盖AsyncTask中的onPreExecute和onPostExecute方法。查看文档。
第二个备用是使用loopj library,它是基于Apache的HttpClient库构建的基于异步回调的Android Http客户端。
利用loopj的示例代码是
AsyncHttpClient client = new AsyncHttpClient();
client.setBasicAuth("username","password/token");
client.get("http://www.example.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
随着时间的推移,我们已经在HttpClient上创建了帮助器,因此我建议您选择一个开源库,例如loopj,它可以帮助您快速完成初始步骤。唯一的挑战是当你来自另一个平台时,你可能会遇到其他库的初步挑战,而不是简单的AsyncTask,但是如果你有灵活性,那就值得花时间。