Android从内部和asynctask获取asynctask的结果

时间:2014-08-28 10:27:09

标签: java android multithreading android-asynctask

我有两个AsyncTasks正在运行,等待结果的异步任务无法获得正确的结果。

我有一个像这样运行的网络类:

public ArrayList<User> searchForFriends(String activeHash, TelephoneNumber telephone)
{
    Object[] obj = {activeHash, telephone};
    try
    {
        return new SearchForFriendsTelephone().execute(obj).get(Constants.TIMEOUT_TIME, Constants.TIMEOUT_UNIT);
    }
    catch (InterruptedException e)
    {
        return null;
    }
    catch (ExecutionException e)
    {
        return null;
    }
    catch (TimeoutException e)
    {
        return null;
    }
}

private class SearchForFriendsTelephone extends AsyncTask<Object, Void, ArrayList<User>>
{
    @Override
    protected ArrayList<User> doInBackground(Object... searchTelephone)
    {
        if (config.getNetworkVersion() == config.NETWORK_PROTOCOL_VERSION_1)
        {
            TelephoneNumber tel = (TelephoneNumber) searchTelephone[1];
            List<NameValuePair> params = new ArrayList<NameValuePair>(3);
            params.add(new BasicNameValuePair(NetworkConfig.POST_ACTIVE_HASH, (String) searchTelephone[0]));
            params.add(new BasicNameValuePair(NetworkConfig.POST_MOBILE_NUMBER_COUNTRY_CODE, tel.getCountryCode()));
            params.add(new BasicNameValuePair(NetworkConfig.POST_MOBILE_NUMBER_RAW, tel.getNumberRaw()));
            ServerCommunication csc = new ServerCommunication();
            JSONObject jsonFoundFriends = csc.postToServer(config.getBaseUrl() + URL_FRIEND_SEARCH_MOBILE, params);
            if (jsonFoundFriends == null || csc.networkError())
            {
                FriendNetworkCommunication.this.networkError = csc.getNetworkError();
                return null;
            }
            return _processSearchFriends(jsonFoundFriends);
        }
        FriendNetworkCommunication.this.networkError = new NetworkError(NetworkLanguage.UNABLE_TO_PROCESS);
        return null;
    }

无论如何,这样可以正常工作,没有任何问题,并撤回用户。我知道这一点,因为我在主ui线程中尝试了以下代码,它填充了一个视图就好了。当我从另一个AsyncTask调用此代码时。我收到超时错误。

所有searchForFriends代码的代码:

private class CompareNumbers extends AsyncTask<ArrayList<NameAndNumber>, Integer, Void>
{
    @Override
    protected Void doInBackground(ArrayList<NameAndNumber>... params)
    {
        for (NameAndNumber nameNumber : params[0])
        {
            try
            {
                FriendNetworkCommunication fnc = new FriendNetworkCommunication();
                ArrayList<User> users = fnc.searchForFriends(CurrentUser.getInstance().getUserActiveHash(), new TelephoneNumber(String.valueOf(nameNumber.getNumber().getNationalNumber()), String.valueOf(nameNumber.getNumber().getCountryCode())));
                if (users != null && users.size() == 1)
                {
                    User u = users.get(0);
                    String[] s = nameNumber.getName().split(" ");
                    u.setFirstName(s[0]);
                    u.setLastName(s[1]);
                    ((ArrayAdapter<User>) ((ListView) getView().findViewById(R.id.friend_add_fragment_search_cont_list)).getAdapter()).add(u);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        ((ArrayAdapter<User>) ((ListView)getView().findViewById(R.id.friend_add_fragment_search_cont_list)).getAdapter()).notifyDataSetChanged();
        return null;
    }
 }

我可以不运行等待另一个的asynctask吗?

注意:如果这有任何不同,这都在片段中运行?

注意2:第一个Asynctask运行网络调用并且必须异步运行,所以我希望它是这样的,所以如果我想我可以在任何地方同步运行它

2 个答案:

答案 0 :(得分:1)

尝试在第一个异步任务的onpostexecute()中提供第二个异步任务的.execute()。

答案 1 :(得分:0)

我找到了问题的答案,但这是不可能的。

可在此处找到完整的答案:

Creating another AsyncTask inside of doInBackground