【问题标题】:Using AsyncTask to call GET, POST methods of a server connection class使用AsyncTask调用服务器连接类的GET、POST方法
【发布时间】:2016-07-04 11:09:00
【问题描述】:

我正在开发一个 android 项目,需要通过 URL 连接到服务器并发送和获取消息。这些方法位于一个名为 Server Connection 的类中。现在我需要在主活动中调用这些方法,但显然我们不能在主线程上进行网络操作。所以我的问题是,当我在服务器连接类中有几个单独的方法时,如何使用 AsyncTask 来做到这一点。下面提供了sn-ps的代码。

服务器连接类:

public class ServerConnection implements Connection{

    JSONParser jsonParser = new JSONParser();
    ArrayList<Message> messages = new ArrayList<Message>();
    JSONObject jsonObject = new JSONObject();



    /**
     * Constructor
     */
    // public ServerConnection() {
    //     getMessages();
    // }

    @Override
    /**
     *  gets a set of Messages in form of an ArrayList and pushs it to the Server
     */
    public void shareMessage(ArrayList<Message> messages){
        this.messages = messages;
        jsonObject = jsonParser.parseMessagetoJSON(messages);
        //JSONArray share = new JSONArray();
        //share.put(jsonObject);
        URL url = null;
        HttpURLConnection client = null;
        try {
            url = new URL("URL goes here");
            client = (HttpURLConnection) url.openConnection();

            client.setRequestMethod("POST");
            client.connect();
            Log.d("MSG", "Connection Successful");
            client.setRequestProperty("Key","Value");
            client.setDoOutput(true);
            client.setChunkedStreamingMode(0);
            OutputStreamWriter out = new OutputStreamWriter(client.getOutputStream());
                .......
                .......
}
}

    //requests the server for Messages and shares them with the Messanger

    public void getMessages(){
        try{
        URL obj = new URL("URL goes in here");
        HttpURLConnection conn = null;

            conn = (HttpURLConnection) obj.openConnection();
            conn.setRequestMethod("GET");
            conn.connect();
            .......
            .......

}
}
}

同样还有另一种 get 方法可以从服务器获取更多数据。现在我需要以某种方式给他们打电话。如何使用 AsyncTask 完成此操作,或者有更简单的方法。

【问题讨论】:

  • 我建议研究 Volley,应该会让你的生活更轻松
  • 我认为你可以使用 Volley 来有效地处理请求响应。另一件事异步任务与活动生命周期无关。所以它可能会产生几个运行时问题。
  • 你为什么不尝试改造。它非常棒,比 http 调用快 7 倍
  • 使用 AsyncTasks 有什么问题?

标签: java android android-asynctask get httpurlconnection


【解决方案1】:

我强烈推荐使用很棒的库:Reftrofit 2、OkHttp 3、Gson。它们使处理 REST api 变得非常简单,无需您必须使用标准 Android 类编写的样板代码。

请参阅下面的小概念证明,了解如何将这些库用于您的案例。

首先确保你的项目包含权限和依赖项:

AndroidManifest.xml

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

build.gradle

...

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.4.0'

    compile 'com.squareup.retrofit2:retrofit:2.1.0'

    compile 'com.squareup.okhttp3:okhttp:3.4.0-RC1'
    compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.0-RC1'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.0-RC1'

    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}

接下来用 WS 方法创建你的适配器

RestAdapter.java

public interface RestAdapter {

    @POST("/shareMessage/{id}/")
    Call<Void> shareMessage(@Path("id") String id, @Body ArrayList<Message> messages);
}

最有趣的事情都在这里。我们创建了支持 http 通信的 RestAdapter 和 ExecutorService 以在后台从我们的适配器调用函数。在这种情况下,ExecutorService 比 AsyncTask 更好,因为可以重复使用。

MainActivity.java

public class MainActivity extends Activity {

    private static final ExecutorService executorService;
    private static final RestAdapter restAdapter;

    static {
        mExecutorService = Executors.newCachedThreadPool();

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        Retrofit retrofit = new Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl("https://foo.com/v1/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        restAdapter = retrofit.create(RestAdapter.class);
    }

    @Override
    protected void onResume() {
        super.onResume();

        shareMessage();
    }

    public void shareMessage() {
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    restAdapter.shareMessage("1", new ArrayList<Message>()).execute().body();
                } catch (IOException e) {
                }
            }
        });
    }
}

来源:RetrofitOkHttp

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多