Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Asynctask doInBackground在实际设备上太慢_Java_Android_Android Asynctask - Fatal编程技术网

Java Asynctask doInBackground在实际设备上太慢

Java Asynctask doInBackground在实际设备上太慢,java,android,android-asynctask,Java,Android,Android Asynctask,我正在开发一个android应用程序,我是线程新手,如果我的问题很愚蠢,我很抱歉,我使用了AsyncTask的doInBackground方法将流转换为字符串,然后在onPostExecute方法中,应用程序将生成JSON对象 我在Emulator(API 17)中启动了我的应用程序,它也启动了Prefict,但当我在智能手机(galaxy s5)上启动它时,时间太长了,可能需要10或15秒。 我认为这种方法是造成这个问题的原因 这是我的主要课程,在这里完成所有工作: 这是我调用Asynctas

我正在开发一个android应用程序,我是线程新手,如果我的问题很愚蠢,我很抱歉,我使用了AsyncTask的doInBackground方法将流转换为字符串,然后在onPostExecute方法中,应用程序将生成JSON对象

我在Emulator(API 17)中启动了我的应用程序,它也启动了Prefict,但当我在智能手机(galaxy s5)上启动它时,时间太长了,可能需要10或15秒。 我认为这种方法是造成这个问题的原因

这是我的主要课程,在这里完成所有工作:

这是我调用Asynctask类并使用POST方法发送参数的地方:

                    final ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("register_number", phoneNumber.getText().toString()));
                Log.i("LOG", "params hastttttttttt" + params.toString());
                //
                //                    Commands.readRegisterNumber(params);

                //                    new readData().execute(params);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    new readData().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
                } else {
                    new readData().execute(params);
                }
        @Override
    protected void onPostExecute(String result) { //doInBackground khorujish ro mide be in
        if (result != null) {
            try {
                G.registerNumber.clear();

                JSONObject object = new JSONObject(result);
                StructRegisterNumber structRegisterNumber = new StructRegisterNumber();
                structRegisterNumber.status = object.optString("status");
                structRegisterNumber.code = object.optString("code");
                structRegisterNumber.message = object.optString("message");



                G.registerNumber.add(structRegisterNumber);

                StructRegisterNumber registerNumber = G.registerNumber.get(0);


                if (registerNumber.status != null && registerNumber.code != null) {
                    if (Integer.parseInt(registerNumber.status) == -1) {
                        Intent intent = new Intent(ActivityRegisterNumber.this, ActivityRegisterCode.class);
                        ActivityRegisterNumber.this.startActivity(intent);
                    }
                }

                progressDialog.dismiss();
            }
            catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            progressDialog.dismiss();
        }
    }

在实际设备上速度较慢的原因有很多:

  • 在实际设备上,网络速度将取决于可用的wifi/网络范围,并且更容易发生数据包丢失
  • 在实际设备上,多个应用程序将同时运行,后台线程的优先级低于服务和其他应用程序。我建议使用SDK工具Systrace(带sched选项)查看后台线程接收到的CPU周期

  • <>这并不完全解决你的问题,但是由于你只是简单地从你的异步任务中的网络上加载数据,你应该考虑使用网络库,比如截击,这使得生活变得简单多了。他们甚至支持Gson,可以自动将返回的Json解析为对象

    文件:

    图书馆本身:

    当我读到你在“午餐”节目时,我咯咯地笑了起来:)对不起,我写得太快了,我犯了一些错误:)我的wifi范围和可用性很好,我在几部智能手机上安装了我的应用程序,它们都有同样的问题,运行doInBackground方法需要很长时间,我的代码或AsyncTask类中是否有任何问题?您是否尝试过DDMS中的网络统计信息?它可能会帮助您了解网络请求期间发生的情况。
        @Override
        protected String doInBackground(List<? extends NameValuePair>... params) {
            List<? extends NameValuePair> param = params[0];
    
            try {
                HttpClient client = new DefaultHttpClient();
                HttpPost method = new HttpPost("http://192.168.10.110:2233/api/register");
                method.setEntity(new UrlEncodedFormEntity(param));
                HttpResponse response = client.execute(method);
                InputStream inputStream = response.getEntity().getContent();
    
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder builder = new StringBuilder();
                String line = "";
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
                result = builder.toString();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }
    
            @Override
        protected void onPostExecute(String result) { //doInBackground khorujish ro mide be in
            if (result != null) {
                try {
                    G.registerNumber.clear();
    
                    JSONObject object = new JSONObject(result);
                    StructRegisterNumber structRegisterNumber = new StructRegisterNumber();
                    structRegisterNumber.status = object.optString("status");
                    structRegisterNumber.code = object.optString("code");
                    structRegisterNumber.message = object.optString("message");
    
    
    
                    G.registerNumber.add(structRegisterNumber);
    
                    StructRegisterNumber registerNumber = G.registerNumber.get(0);
    
    
                    if (registerNumber.status != null && registerNumber.code != null) {
                        if (Integer.parseInt(registerNumber.status) == -1) {
                            Intent intent = new Intent(ActivityRegisterNumber.this, ActivityRegisterCode.class);
                            ActivityRegisterNumber.this.startActivity(intent);
                        }
                    }
    
                    progressDialog.dismiss();
                }
                catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                progressDialog.dismiss();
            }
        }