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

时间:2014-04-10 10:08:07

标签: android android-asynctask

我尝试使用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; - 我该怎么办?

1 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。

首先了解AsyncTask的实际工作方式。

当您在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[]中处理结果!