使用 HTTP POST 请求替代 AsyncTask,因为它已被弃用

问题描述 投票:0回答:5

我 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;
}
java asynchronous android-asynctask http-post
5个回答
0
投票

将 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;
    });
  });
 }

0
投票

使用 Retrofit 进行 http post 请求,因为它既简单又灵活。


0
投票

我无法编译#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);

0
投票

试试这个库

任务KT

科特林

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();

-1
投票
  ExecutorService executor = Executors.newSingleThreadExecutor();
  Handler handler = new Handler(Looper.getMainLooper());
  executor.execute(() -> {
        //Background work here
        handler.post(() -> {
            //UI Thread work here
        });
  });
© www.soinside.com 2019 - 2024. All rights reserved.