我尝试使用Asyntask,但它没有奏效...... 我需要把这个函数放在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);
&#34;类型不匹配:无法从AsyncTask转换为String []&#34; - 我该怎么办?
答案 0 :(得分:3)
您的代码存在一些问题。
当您在UI线程上调用yourAsyncTask.execute(args)
时,会发生以下情况:
onPreExecute()
来设置 UI线程 上的内容。这允许您访问UI元素。
然后使用[{1}}的参数调用doInBackground()
,并在 后台主题 上运行。此参数的类型由子类中的第一个泛型参数指示(在您的情况下为.execute()
)。必须可以通过线程访问Void
中使用的数据,一般情况下,当您致电doInBackground()
时,您应该在此处提供所需的数据。
在执行期间,可以在.execute()
内调用publishProgress()
,doInBackground()
将通过onProgressUpdate()
(可以访问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>>
拥有两个arraylists,一个是itemarray,另一个包含两个EditTexts的String内容(只是一个想法)。
您的方法签名将如下所示:doInBackground(ArrayList<ArrayList<String>>... args)
- 您可以在doInBackground()
内访问所需的数据。
第二 - 一旦达到onPostExecute()
。你永远不会对结果做任何事情。因此,如果您使用String []来例如更新ListView
,然后您应该在此处致电setAdapter()
,或者您想对结果做些什么。
我希望这有帮助并且有意义。
编辑:根据您更新的问题,您使用三个参数调用.execute()
,这些参数当然会失败,因为您告诉AsyncTask您不会提供任何参数(您给它{关于Void
)中的第一个参数{1}}。
编辑2 :您可以像这样开始工作线程:
<Void, Void, String[]>
这不起作用,因为String []bestRoute= myTask.execute(itemArrey, fromPosition, toPosition);
会返回自己的实例(换句话说是myTask.execute()
),而不是AsyncTask
。这就是您在该行中出现类型不匹配的原因。您需要在String[]
中处理结果!