Android Server异步通信

时间:2014-06-10 11:50:30

标签: android asynchronous

我正在研究异步客户端服务器应用程序。在异步请求服务器之后,我应该处理该消息并发送回客户端。要异步接收来自服务器的响应,客户端应该有一种RESTful服务器。我可以在Android客户端上使用任何库或API吗? 感谢名单

5 个答案:

答案 0 :(得分:4)

Retrofit使用Square
(来自网站:)

简介

Retrofit将您的REST API转变为Java界面。

public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user);
}

RestAdapter类生成GitHubService接口的实现。

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();

GitHubService service = restAdapter.create(GitHubService.class); 对生成的GitHubService的每次调用都会向远程Web服务器发出HTTP请求。

List<Repo> repos = service.listRepos("octocat");

使用注释来描述HTTP请求:

URL参数替换和查询参数支持 对象请求正文的转换(例如,JSON,协议缓冲区) 多部分请求正文和文件上传

同时尽量避免AsyncTask,这是关于这个主题的好读物:Robust and readable architecture for an Android App

答案 1 :(得分:2)

实际上没有使用Asynctask - 它缺乏正确的网络框架所需的重要功能(或者你只是自己坐下来开发几个小时)

2013年

Google developed Volley

  • Volley自动安排所有网络请求。这意味着Volley将负责处理您的应用程序执行的所有网络请求,以便从Web获取响应或图像。
  • Volley提供透明的磁盘和内存缓存。
  • Volley提供强大的取消请求API。这意味着您可以取消单个请求,也可以设置要取消的请求块或范围。 Volley提供强大的定制功能。
  • Volley提供调试和跟踪工具

(来自:Android – Volley Library Example

资源

Gradle Dependency

compile 'com.mcxiaoke.volley:library:1.0.+'

答案 2 :(得分:0)

尝试实现这样的代码:

ProgressDialog progressDialog=null;   

private class LoadApi extends AsyncTask<String, Void, String> {

                    @Override
                    protected void onPreExecute() {
                        progressDialog=ProgressDialog.show(YourActivity.this, "", 
                            "Please wait...");
                        super.onPreExecute();
                    }

                    protected String doInBackground(String... urls) {
                        //Do your api call stuff here
                        return null;
                    }
                    protected void onPostExecute(String result) {
                        handle response from api call here.
                        progressDialog.dismiss();
                    }
                }

答案 3 :(得分:0)

您可以将AsyncTask用于相同的

这是官方文档http://developer.android.com/reference/android/os/AsyncTask.html

我也给你一个Asyntask的例子。

class TestAsyncTask extends AsyncTask<Void, Integer, String>
{
    protected void onPreExecute (){
        Log.d("ASYNCTASK","On pre Exceute......");
    }

    protected String doInBackground(Void...arg0) {
        Log.d("ASYNCTASK","In On doInBackground...");
 // make request RESTful service here.
        for(int i=0; i<10; i++){
            Integer in = new Integer(i);
            publishProgress(i);  // Update your Ui
        }
        return "You are in PostExecute";
    }

    protected void onProgressUpdate(Integer...a){
        Log.d("ASYNTASK","You are in progress update ... " + a[0]);
    }

    protected void onPostExecute(String result) {

        // here you can perform all action after getting resonances from RESTful service
        Log.d(""+result);
    }
}

答案 4 :(得分:0)

如果您需要http服务的外部库。您可以使用Android异步Http客户端

  

http://loopj.com/android-async-http/

从链接下载jar文件使用此方法

public void getData(String URL)
{

    AsyncHttpClient client = new AsyncHttpClient();
    client.setTimeout(30000);
    client.get(URL, new AsyncHttpResponseHandler()
    {

        @Override
        public void onSuccess(String arg0)
        {
            // TODO Auto-generated method stub
            super.onSuccess(arg0);


        }

        @Override
        public void onFailure(Throwable arg0, String arg1)
        {
            // TODO Auto-generated method stub
            super.onFailure(arg0, arg1);



        }

    });
}

你在onsucess中得到了一个字符串的结果。 在您的清单文件中,您必须获得许可

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />