我 5 年前制作了一个 Android 应用程序,它使用 AsyncTask 创建一个 HTTP POST 请求,以从服务器发送接收数据,并带有两个参数。任何帮助将不胜感激,谢谢
调用示例:
String asyncResult = new AsyncCall().execute(UrlServer, jsonData.toString()).get();
我的基本 AsyncTask 类
public class AsyncCall extends AsyncTask<String, String, String>{
private static final int CONNECTION_TIMEOUT=10000;
private static final int READ_TIMEOUT=15000;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
//URL: params[0]
//JSON Data: params[1]
// I made HTTP URL CONNECTION and store server data in result variable
}
@Override
protected void onPostExecute(String result) {
return result;
}
将 ExecutorService 与方法一起使用。
不要调用异步任务,而是调用带参数的方法。
String asyncResult = AsyncCall(UrlServer, jsonData.toString());
创建方法来处理参数。
public String AsyncCall(String UrlServer, String jsonData) {
private static final int CONNECTION_TIMEOUT=10000;
private static final int READ_TIMEOUT=15000;
private static String getResult = null;
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(() -> {
//Background work here
//URL: params[0]
String URL = UrlServer;
//JSON Data: params[1]
String JSONData = jsonData;
// I made HTTP URL CONNECTION and store server data in result variable
getResult = result;
handler.post(() -> {
//UI Thread work here
return result;
});
});
}
使用 Retrofit 进行 http post 请求,因为它既简单又灵活。
我无法编译#Jayavinoth 提出的内容,所以我制定了对我有用的解决方案。此外,出于理智和清晰的目的,我将其放在外部类中。但您可以将其移至 MainActivity 并摆脱对它的引用。
public class GetAsyncURL {
private final MainActivity mainActivity;
public GetAsyncURL (MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
public void asyncCall(String urlServer) {
AtomicReference<String> getResult = new AtomicReference<>();
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(() -> {
//Background work here
String answerHTTP = null;
try {
answerHTTP = getUrlString(urlServer);
} catch (IOException e) {
e.printStackTrace();
}
getResult.set(answerHTTP);
handler.post(() -> {
//UI Thread work here
if(getResult.get() != null && !getResult.get().equals("")) {
mainActivity.process_your_result_in_main(getResult.get());
}
});
});
}
private static String getUrlString(String urlSpec) throws IOException {
URL url = new URL(urlSpec);
URLConnection connection = url.openConnection();
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = connection.getInputStream();
int bytesRead;
byte[] buffer = new byte[65536];
while((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
out.close();
return out.toString();
}
}
然后你可以简单地调用它:
new GetAsyncURL(this).asyncCall(your_url);
试试这个库
科特林
Task {//Outer Task
Task.Foreground.start {
Toast.makeText(
this@MainActivity,
"This is how you can toast with Task",
Toast.LENGTH_SHORT
).show()
}
sleep(1000)
publishProgress(25)
sleep(1000)
publishProgress(56)
sleep(2000)
publishProgress(100)
sleep(500)
"T"
}.doInBackground() //or .doInForeground() # default it will be background task
.onStart {
textView.text = "Starting task"
}.onEnd {
textView.append("\n" + "Task Finished")
}.onResult { result ->
textView.append("\nResult $result")
}.onError { error ->
textView.append("\nError " + error.message)
}.onProgress {
textView.append("\nProgress ${it[0]}")
}.then {
Task {//Inner Task
sleep(2000)
publishProgress("Result of outer task is $it")
sleep(2000)
"CT"
}.onStart {
textView.append("\nStarting chained task")
}.onEnd {
textView.append("\nChained task Finished")
}.onResult { result ->
textView.append("\nChained task Result $result")
}.onError { error ->
textView.append("\nChained task Error " + error.message)
}.onProgress {
textView.append("\nChained task Progress ${it[0]}")
}
}.start()
Java 任务
new Task<>(task -> {//Outer Task
Task.Foreground.start(() -> Toast.makeText(this, "This is how you can toast with Task", Toast.LENGTH_SHORT).show());
task.sleep(1000);
task.publishProgress(25);
task.sleep(1000) //Function chaining is also possible
.publishProgress(56)
.sleep(2000)
.publishProgress(100)
.sleep(500);
return "T2";
})
.doInBackground() //or .doInForeground() # default it will be background task
.onStart(() -> textView.append("\nStarting task 2"))
.onEnd(() -> textView.append("\n" + "Task 2 Finished"))
.onResult(result -> textView.append("\nTask 2 " + result))
.onError(error -> textView.append("\nTask 2 " + error.getMessage()))
.onProgress(progress -> textView.append("\nTask 2 Progress " + progress[0]))
.then(result ->
new Task<>(t2 -> {//Inner Task
t2.sleep(2000);
t2.publishProgress("Result of outer task is " + result);
t2.sleep(2000);
return "Task 2 chained result";
}).onEnd(() -> textView.append("\nChained task 2 finished")
).onProgress(progress -> textView.append("\nChained Task 2 Progress " + progress[0])
).onResult(result2 -> textView.append("\n" + result2)))
.start();
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(() -> {
//Background work here
handler.post(() -> {
//UI Thread work here
});
});