gpt4 book ai didi

java - AsyncTask 类等待另一个 AsyncTask 类完成其进程的正确方法是什么

转载 作者:行者123 更新时间:2023-12-02 03:05:54 28 4
gpt4 key购买 nike

我正在开发一个访问 Web 服务的应用程序,并使用从中获取的 JSON 创建一个对象并在我的代码中使用它。尽管我的应用程序正在运行,但我不知道它是否写得很好且完美无缺。

我将解释我的内容,然后放置一些示例代码来演示...首先,我创建了一个带有 EditText 和按钮的 Activity ,用户将在其中键入代码并单击按钮来访问我的数据库并检查它是否存在。主要在这里:在我的button.OnClickListener中,我检查EditText上是否有东西,以及我是否有互联网连接<-(我从来没有遇到过任何问题),然后我调用我的类RestClient,它是从AsyncTask,在后台访问 WebService 并从中获取对象。只有之后我才会从这个 RestClient 得到结果。我的解决方案是启动一个新的 AsyncTask 来等待我的 RestClient,然后启动获取对象的过程。

这是我的代码示例,我的restClient 从我的网络服务返回通用对象:

public class RestClient<t>  extends AsyncTask<String, String, String> {

private Class<t> tClass;
private t ObjReturn;

public RestClient(Class<t> tClass)
{
this.tClass = tClass;
}

public Object getObjectResponse(){
return ObjetoDeRetorno;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected String doInBackground(String... OnlyTheURL) {
String urlString = OnlyTheURL[0];
String error = null;
WebApiDeRetorno = new WebApiRetorno();
try {
Log.i("RestClient","Starting connection");

URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");

connection.connect();

String result = convertStreamToString(connection.getInputStream());

connection.disconnect();

JSONObject jsonObject = new JSONObject(result);

String obj = jsonObject.get("returnObject").toString();

Gson gson = new Gson();
ObjReturn = gson.fromJson(obj, tClass);


} catch (IOException | JSONException e) {
e.printStackTrace();
return error;
}
return null;
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}

我的按钮功能:

buttonConfirmar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {


restClient = new RestClient<>(MyObject.class);

restClient.execute(getString(R.string.WebServiceURL));
new WhenWebServiceConnectionFinished().execute();

}
});

在 RestClient 之后执行的另一个 AsyncTask 类,需要等待它完成:

private class WhenWebServiceConnectionFinished extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPreExecute() {
progressDialog.show();
super.onPreExecute();
}

@Override
protected Boolean doInBackground(String... params) {

//THIS IS WHAT I DON'T KNOW IF IT'S OK TO DO:
do {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (restClient.getStatus() != AsyncTask.Status.FINISHED);
//WAITING THE restClient.getStatus CHANGE TO FINISHED WITH Thread.sleepS.

if (checkWebApiRetorno()) {
objectReturnFromWebApi = (MyObject) restClient.getObjectResponse();

Intent intent = new Intent(thisActivity, NewActivity.class);
startActivity(intent);
finish();
return true;
}
return false;
}

@Override
protected void onPostExecute(Boolean success) {
if (progressDialog.isShowing())
progressDialog.dismiss();

if (!success)
dialogBuilder.create().show();

super.onPostExecute(success);
}
}

最佳答案

向第一个AsyncTask添加回调,并仅在第一个AsyncTask触发onPostExecute后运行第二个AsyncTask

类似

public interface AsyncFinishedCallback{
public void onAsyncFinished();
}

并在第一个AsyncTask中执行这样的构造函数

public RestClient(Class<t> tClass, AsyncFinishedCallback callback)
{
this.tClass = tClass;
this.callback = callback; //declare it somewhere as a field
}

并且比

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if(callback!=null)
callback.onAsyncFinished();
}
}

比按钮功能

buttonConfirmar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {


restClient = new RestClient<>(MyObject.class, new AsyncFinishedCallback(){
@Override
public void onAsyncFinished(){
new WhenWebServiceConnectionFinished().execute();
}
});

restClient.execute(getString(R.string.WebServiceURL));

关于java - AsyncTask 类等待另一个 AsyncTask 类完成其进程的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41745871/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com