其他类中的Android AsyncTask从Activity调用

时间:2015-03-05 13:20:52

标签: java android android-asynctask android-studio gson

我有一个MainActivity,我在其中实例化一个类。该类包含基本数据和两个重要方法:GetRequestAccessUrl(params)getToken(string),它们返回一个AuthResponse。

第一种方法运行正常,在应用程序中生成并处理字符串。但是,getToken - 方法涉及网络,因此禁止在主线程上运行,建议使用AsyncTask。后一种方法的实施如下:

public AuthResponse getToken(String code) {
    if (secrete == null) {
        throw new IllegalStateException("Application secrete is not set");
    }

    try {

        URI uri = new URI(TOKEN_URL);
        URL url = uri.toURL();

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();


        try {
            StringBuilder sb = new StringBuilder();
            sb.append("client_id=" + clientId);
            sb.append("&client_secret=" + secrete);
            sb.append("&code=" + code);

            conn.setRequestMethod("POST");
            conn.setRequestProperty("Accept", "application/json");
            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();


            os.write(sb.toString().getBytes("UTF-8"));

            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

            Reader br = new InputStreamReader((conn.getInputStream()));
            Gson gson = new Gson();
            return gson.fromJson(br, AuthResponse.class);

        } finally {
            conn.disconnect();
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

在MainActivity中创建整个类,调用第一个方法,执行一些操作并运行getToken - 方法。但是我似乎完全停留在如何做到这一点,或者如何创建关于此方法的(工作)AsyncTask。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

new YourAsyncTask ().execute(code);


private class YourAsyncTask extends AsyncTask<String, Integer, Integer> {
     protected Long doInBackground(String... codes) {
        AuthResponse res = getToken(codes[0]);
        doSthWithRes(res);
     }

     protected void onProgressUpdate(Integer... progress) {}

     protected void onPostExecute(Integer result) {}
 }

这可能会奏效。取决于您想要使用AuthResponse做什么。 正如您所看到的,ASyncTask更像是后台批处理。我更喜欢使用标准线程。此外,您可能希望在UIThread中处理AuthResponse。 这里是Quick和dirty版本:

/* It would be better to create a subclass of Runnable and pass the Code in the constructor*/
final String code = "testcode";
//Create the new Thread
Thread t  = new Thread(new Runnable() {
    @Override
    public void run() {
        final AuthResponse res = getToken(code);
        //RunOnUiThread is a method of the Activity
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                doSomethingWithResponse(res);
            }
        });
    }       
});
t.start()

答案 1 :(得分:0)

尝试这样的事情

   new AsyncTask<String, void, AuthResponse>() {
    @Override
    protected String doInBackground(String... params) {
        String id = params[0];
        String secret = params[1];
        String code = params[2];

        //do  your stuff

        return myAuthResponse;
    }
    @Override
    protected void onPostExecute(AuthReponse result) {
        //do stuff with AuthResponse
    }
}.execute(clientId, clientSecret, code);

在onPostExecute中,您可以在UIThread上处理AuthResponse。

答案 2 :(得分:0)

我认为我在以下主题中回答了这个问题: Java AsyncTask passing variable to main thread

Http请求在后台在Asyntask中完成,并且由于回调,结果被发送到主活动。我给出了答案的示例代码。