我有一个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。任何帮助表示赞赏。
答案 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中完成,并且由于回调,结果被发送到主活动。我给出了答案的示例代码。