gpt4 book ai didi

android - 在android中使用asynctask调用函数的问题

转载 作者:行者123 更新时间:2023-11-29 17:50:46 25 4
gpt4 key购买 nike

我尝试使用 Asyntask,但没有成功...我需要把这个函数放在异步任务中:

public  String [] orderAddresses (ArrayList<String> itemArrey, EditText fromPosition, EditText toPosition)

如果有人能帮助我,我会很高兴:)

**已编辑

    class Task1 extends AsyncTask<Object, Void, String []> {

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

@Override
protected String[] doInBackground(Object... params) {
ArrayList<String> iA=(ArrayList<String>)params[0];
EditText fPosition= (EditText)params[1];
EditText tPosition= (EditText)params[2];
return orderAddresses(iA, fPosition, tPosition) ;
}

@Override
protected void onPostExecute(String [] result)
{
super.onPostExecute(result);

}

}

Task1 myTask = new Task1();
String []bestRoute= myTask.execute(itemArrey, fromPosition, toPosition);

“类型不匹配:无法从 AsyncTask 转换为 String[]”-我该怎么办?

最佳答案

您的代码有几个问题。

首先介绍一下 AsyncTask 的实际工作原理。

当您调用 yourAsyncTask.execute(args) 时在您的 UI 线程上发生以下情况:

onPreExecute()被调用以在 UI 线程 上设置内容。这允许您访问 UI 元素。

然后 doInBackground()使用 .execute() 的参数调用并在后台线程 上运行。此参数的类型由子类中的第一个通用参数指示(在您的情况下为 Void )。 doInBackground()中使用的数据必须可由线程访问,一般情况下,您应该在调用 .execute() 时在此处提供所需的数据开始。

在执行期间可以调用 publishProgress()doInBackground() 内,它将通过 onProgressUpdate() 将更新委托(delegate)给 UI 线程(您可以在其中访问 UI 元素)。此处给出的数据类型由 AsyncTask 的第二个通用参数指示。 (在你的情况下又是 Void)。

doInBackground()完成后将结果提供给 onPostExecute()UI thread 上运行.结果的类型由您的第三个通用参数(在您的情况下为 String[])指示。但是调用 super.onPostExecute() 并没有真正为你做任何事情——你需要使用从 doInBackground() 返回的数据。并用它做点什么——更新你的用户界面之类的。没有什么是自动发生的。自 onPostExecute()在 UI 线程上运行,您可以在此处访问您的 UI 元素(您不能在 doInBackground() 中访问)。

所以对于你的代码:

首先你调用doInBackground()Void .它无法访问 UI 线程外的 UI 数据,因此当您向此调用添加编辑文本参数时,它无法访问它们。您应该通过 .execute() 提供内容.并将您的第一个通用参数设置为可以包含 doInBackground() 所需的所有数据的类型.你可以例如有ArrayList<ArrayList<String>>包含两个数组列表,一个是 itemarray,另一个包含两个 EditText 的字符串内容(只是一个想法)。

您的方法签名将如下所示:doInBackground(ArrayList<ArrayList<String>>... args) - 这使您可以访问 doInBackground() 中所需的数据.

其次 - 一旦您到达 onPostExecute() .你永远不会对结果做任何事情。因此,如果您将 String[] 用于例如更新 ListView , 那么你应该调用 setAdapter()在这里,或任何您想对结果做的事情。

我希望这对您有所帮助并且有意义。

编辑:根据您更新的问题,您调用 .execute()三个参数当然会失败,因为你已经告诉 AsyncTask 你不会提供任何参数(你给它 Void<Void, Void, String[]> 的第一个参数)。

编辑 2:您像这样启动工作线程:

String []bestRoute= myTask.execute(itemArrey, fromPosition, toPosition);

这不会像 myTask.execute() 那样工作返回自身的实例(换句话说 AsyncTask ),而不是 String[] .这就是您在该行中出现类型不匹配的原因。您需要处理 onPostExecute() 中的结果!

关于android - 在android中使用asynctask调用函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984939/

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