繁体   English   中英

Android AsyncTask在主线程上

[英]AsyncTask Android on main thread

我正在尝试使用AsyncTask实现对Internet的异步访问,但是在日志目录中,我的日志记录的PIDTID是相同的,因为AsyncTask不会创建并行队列,因此我的应用程序因NetworkOnMainThreadException崩溃。

这是我的子类代码:

class BL_SimpleAsyncTask extends AsyncTask<Void, Void, Void> {

        String requestServer;
        HashMap<String, String> postRequestBody;
        //------------------------// answer from http client
        static DefaultHttpClient sharedClient = null;

        boolean isPostRequest;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            System.out.println("bg started");

            if (sharedClient == null) {
                sharedClient = new DefaultHttpClient();
            }

            HttpPost post = new HttpPost(requestServer);
            String postBody = new String();
            postBody += "{";
            for (String key : postRequestBody.keySet()) {
                String result = String.format("\"%s\":\"%s\",", key, postRequestBody.get(key));
                postBody += result;

            }

            System.out.println("body initialized");


            postBody.substring(0, postBody.length() - 1);
            postBody += "}";
            try {
                post.setEntity(new StringEntity(postBody));
            } catch (UnsupportedEncodingException e) {
                System.out.println(e.getMessage());
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println("entity set");


            try {
                if (post != null) {
                    System.out.println("starting request....");
                    HttpResponse response = sharedClient.execute(post);
                    System.out.println("responce recieved");
                } else {
                    System.out.println("null request");

                }
                // System.out.println(response) ;

            } catch (ClientProtocolException e) {
                System.out.println(e.getMessage());

                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println(e.getMessage());

                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
        }
    }

}

因此,要开始请求后,我只需执行以下操作:

    BL_SimpleAsyncTask obj = new BL_SimpleAsyncTask() ;
    obj.requestServer = "https://api.orbios.com/v1/auth/sign-in" ;
    obj.postRequestBody = new HashMap<String, String> () ;
    obj.postRequestBody.put ("password", password) ;
    obj.postRequestBody.put("email", email ) ;
    obj.isPostRequest = true ;
    System.out.println("start bg thread") ;

    obj.doInBackground() ;

我究竟做错了什么?

而不是直接调用doInBackground()您应该调用execute方法。

您不应该自己调用doInBackground() 只需调用execute()并让框架在后台线程中调用doInBackground()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM