【问题标题】:Can a StringRequest be created inside a doInBackground() method?可以在 doInBackground() 方法中创建 StringRequest 吗?
【发布时间】:2016-02-26 20:47:45
【问题描述】:

我正在创建一个按钮,单击该按钮会调用checkUserName 方法,该方法搜索数据库并告知用户名是否可用。 URL_CHECK_USERNAME 响应“用户名可用”或“用户名不可用”。

    public void checkUserName(View v){

        String username = inputUserName.getText().toString().trim();
        new CheckUsername().execute(username);

    }

    class CheckUsername extends AsyncTask<String, String, String>{

        String r = null;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(RegisterActivity.this);
            pDialog.setMessage("Checking Availability of this Username...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... params) {

            //String r = null;
            final String username = params[0];

            StringRequest strReq = new StringRequest(Method.POST,
                    AppConfig.URL_CHECK_USERNAME, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    r = response;
                }

            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {

                    Log.e(TAG, "Error in checking username." + volleyError.getMessage());
                    Toast.makeText(getApplicationContext(), volleyError.getMessage(), Toast.LENGTH_SHORT).show();
                    hideDialog();
                }
            }){
                @Override
                protected Map<String, String> getParams()  {

                    Map<String, String> param = new HashMap<>();
                    //param.put("username", params[0]);
                    param.put("username", username);
                    return param;
                }
            };


            AppController.getInstance().addToRequestQueue(strReq);

            return r;

        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            pDialog.dismiss();
            Toast.makeText(RegisterActivity.this, s, Toast.LENGTH_SHORT).show();
        }

    }

这个程序每次都显示一个空的 Toast。可能是什么问题?

【问题讨论】:

  • 这还能编译吗?看起来你已经注释掉了 r 的声明位置。

标签: java android android-asynctask android-volley


【解决方案1】:

根据您发布的代码,我想您正在使用 Volley 作为您的网络库。 如果是这种情况,您应该意识到不需要您的 Asynctask,因为 Volley 会为您处理线程。

请求将在后台执行,回调将被异步调用。这就是为什么你的吐司是空的。

在您的 checkUsername(View) 方法中创建您的 StringRequest,并在 onResponse 回调中显示 toast。

【讨论】:

  • 我没有得到你的第二段。为什么吐司是空的? @Avsector
  • 如果您不知道“异步处理”是什么,请查看“异步处理”,因为您应该了解这一点,以便做您想做的事情。一旦你理解了这一点,你应该会看到 doInBackground 方法在 HTTP 请求发生之前立即返回,没有任何东西可以显示。
猜你喜欢
  • 2022-09-27
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2019-11-15
  • 2020-11-04
  • 2019-10-12
相关资源
最近更新 更多