java - Android 从内部和 asynctask 中获取 asynctask 的结果

标签 java android multithreading android-asynctask

我有两个异步任务正在运行,正在等待结果的异步任务只是没有得到正确的结果。

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

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 线程中尝试了以下代码,它很好地填充了一个 View 。当我从另一个 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;
    }
 }

我不能运行等待另一个任务的异步任务吗?

注意:这一切都在 fragment 中运行,如果这有什么区别的话?

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

最佳答案

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

关于java - Android 从内部和 asynctask 中获取 asynctask 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25546522/

相关文章:

java - 操作失败 : gradle dependencies CircleCi

c - 并行化一个函数

java - 根据帕累托原则从列表中随机选择

java - 跨客户端身份服务器到客户端传递访问 token

android - 约束布局与相对布局

android - Flutter doctor 终端命令不起作用

c# - Form.Show() 间歇性地在线程中显示表单

python - FastAPI 和 Python 线程

java - 将 Java 构建的应用程序核心更改为 Scala - 错误和其他疑问

java - 如何使用Java中的Excel文件中的随机函数随机读取单元格值?