gpt4 book ai didi

java - AsyncTask - 如何在 onPostExecute 之后将值传递回 Activity 类?

转载 作者:行者123 更新时间:2023-12-02 12:25:39 25 4
gpt4 key购买 nike

这是我的问题。我创建了一个 asyncTask 来链接到我的数据库并使用 JSON 发送和接收信息。

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);

progressDialog.dismiss();
returnValues = dataParsed.split("\\s+");

mainActivity.getValue(this is the function that calls anotherfunction in
asyncTask)

Log.v("ARRAY LENGTH", String.valueOf(returnValues.length));
}

public String[] returnmyString(){
//return mySaveData;
Log.v("ARRAY LENGTH 2", String.valueOf(returnValues.length));
return returnValues;
}

我在基于 Activity 的类中创建 asyncTask 对象,然后调用该 object.execute。我的问题是,一旦调用 object.execute,我的代码将继续运行,并且其中一行在执行完所有代码之前调用 asyncTask 类中的函数。

process.activitySave(1); //<---Process is the object for the asyncTask class
process.ContextSave(this,ServerURLSource,myParameters);
process.execute()
changedData = process.returnmyString(); //<-- this is the line of code that gets implemented that returns a null value

我尝试在 asyncTask 类中创建一个 Mainactivity 对象,然后调用一个函数来检索该值,但是当我这样做时,我的应用程序崩溃了。任何帮助,将不胜感激。我想在 mainactivity 类中放置某种监听器,因为我似乎无法在 asyncTask 类中引用 mainactivity 类中的任何函数。

这是 asyncTask 中返回值的函数:

public String[] returnmyString(){
//return mySaveData;
Log.v("ARRAY LENGTH", String.valueOf(returnValues.length));
return returnValues;
}

最佳答案

方法 1 是基本的匿名内部类实现。由于内部 AsyncTask 类不是静态类,因此您可以从该实现访问 CustomActivity 的属性。

方法2中,AsyncClass单独实现。如果你把你的 Activity 交给这个类,它可以在执行后回调你想要的方法。对于我们的示例,此方法是#setChangedData 方法。 CustomAsyncTask 回调#onPostExecute 中的#setChangedData。

public class CustomActivity extends AppCompatActivity {

String mChangedData;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Method 1 - change data into the anonymously implemented AsyncTask class
new AsyncTask<Integer, Void, Void>() {

@Override
protected Void doInBackground(Integer... params) {
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
CustomActivity.this.mChangedData = "foo"; // this changes mChangedData as "foo"
}
}.execute(1);

// Method 2 - change data into the custom AsyncTask class
new CustomAsyncTask(this).execute(2);
}

public void setChangedData(String changedData){
this.mChangedData = changedData;
}

static class CustomAsyncTask extends AsyncTask<Integer, Void, Void> {
CustomActivity mActivity;
public CustomAsyncTask(CustomActivity activity) {
this.mActivity = activity;
}
@Override
protected Void doInBackground(Integer... params) {
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mActivity.setChangedData("bar");
}
}
}

并且,与方法 3 一样,如果您想更宽松地分离 Activity 和 AsyncTask,请使用以下处理程序方法:

public class CustomActivity extends AppCompatActivity {

private String mChangedData;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

CustomAsyncTask task = new CustomAsyncTask();
task.setOnDataChangedListener(new CustomAsyncTask.OnDataChangedListener() {
@Override
public void onDataChanged(String data) {
mChangedData = data;
}
});
task.execute(1);
}

private static class CustomAsyncTask extends AsyncTask<Integer, Void, Void> {

private OnDataChangedListener onDataChangedListener;
@Override
protected Void doInBackground(Integer... params) {
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if(onDataChangedListener != null) {
onDataChangedListener.onDataChanged("foo");
}
}

void setOnDataChangedListener(OnDataChangedListener onDataChangedListener) {
this.onDataChangedListener = onDataChangedListener;
}

interface OnDataChangedListener {
void onDataChanged(String data);
}
}
}

关于java - AsyncTask - 如何在 onPostExecute 之后将值传递回 Activity 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45493437/

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