在进行 HTTP 调用时显示以下堆栈跟踪 [重复]

Posted

技术标签:

【中文标题】在进行 HTTP 调用时显示以下堆栈跟踪 [重复]【英文标题】:Show following stack trace while Making HTTP call [duplicate] 【发布时间】:2014-05-22 06:27:59 【问题描述】:

我使用以下代码行从服务器获取HttpResponce。在运行代码时,我在 logcat 中得到以下堆栈跟踪。有什么线索吗?

我使用的代码:

new DeleteDirectoryLoaderTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

class DeleteDirectoryLoaderTask extends AsyncTask<URL, Integer, Long>
    
        DeleteDirectoryLoaderTask()
        
    
        
        
        @Override
        protected void onPreExecute()
           
                
        

        @Override
        protected Long doInBackground(URL... urls)
                   
            
            
            try 
            
                HttpResponse responceFromServer = m_HttpResponceInstance.makeRequest("post", HTTP_URI + "/" + "signup", registrationHeader, jsonMain);  
             
            catch (Exception e) 
                               
                e.printStackTrace();
            
            
            return null;
        

        @Override
        protected void onProgressUpdate(Integer... progress)
        

        

        @Override
        protected void onPostExecute(Long result)
                   
                                            
        
       

public HttpResponse makeRequest(String httpMethod, String url, Map<String, String> Header, JSONObject jsonObject) throws Exception 
    
        HttpResponse responce = null;
        
        if(httpMethod.equals("post"))
        
            DefaultHttpClient httpclient = new DefaultHttpClient();

            //url with the post data
            HttpPost httpost = new HttpPost(url);
            
            //passes the results to a string builder/entity
            StringEntity se = new StringEntity(jsonObject.toString());
            
            //sets the post request as the resulting string
            httpost.setEntity(se);
            
            for ( String key : Header.keySet() )
            
                //sets a request header so the page receving the request
                //will know what to do with it
                httpost.setHeader(key, Header.get(key));
            
            
            responce = httpclient.execute(httpost); 
            System.out.println(responce);
        
        
        return  responce;
    

log cat 中的堆栈跟踪

06-07 13:24:14.007: W/System.err(1857): android.os.NetworkOnMainThreadException
06-07 13:24:14.017: W/System.err(1857):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
06-07 13:24:14.022: W/System.err(1857):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
06-07 13:24:14.022: W/System.err(1857):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-07 13:24:14.022: W/System.err(1857):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
06-07 13:24:14.027: W/System.err(1857):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
06-07 13:24:14.027: W/System.err(1857):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-07 13:24:14.027: W/System.err(1857):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-07 13:24:14.027: W/System.err(1857):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-07 13:24:14.032: W/System.err(1857):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
06-07 13:24:14.032: W/System.err(1857):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
06-07 13:24:14.032: W/System.err(1857):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-07 13:24:14.032: W/System.err(1857):     at in.plackal.lovecyclesfree.HttpResponceManager.makeRequest(HttpResponceManager.java:54)
06-07 13:24:14.037: W/System.err(1857):     at in.plackal.lovecyclesfree.RegisterAccountActivity.onClick(RegisterAccountActivity.java:161)
06-07 13:24:14.037: W/System.err(1857):     at android.view.View.performClick(View.java:4261)
06-07 13:24:14.037: W/System.err(1857):     at android.view.View$PerformClick.run(View.java:17356)
06-07 13:24:14.037: W/System.err(1857):     at android.os.Handler.handleCallback(Handler.java:615)
06-07 13:24:14.037: W/System.err(1857):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-07 13:24:14.042: W/System.err(1857):     at android.os.Looper.loop(Looper.java:137)
06-07 13:24:14.042: W/System.err(1857):     at android.app.ActivityThread.main(ActivityThread.java:4921)
06-07 13:24:14.042: W/System.err(1857):     at java.lang.reflect.Method.invokeNative(Native Method)
06-07 13:24:14.042: W/System.err(1857):     at java.lang.reflect.Method.invoke(Method.java:511)
06-07 13:24:14.047: W/System.err(1857):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
06-07 13:24:14.047: W/System.err(1857):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
06-07 13:24:14.047: W/System.err(1857):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

【参考方案1】:

这必须在 asynctask 中完成。 (http://developer.android.com/reference/android/os/AsyncTask.html) 将代码放入doInBackground

【讨论】:

【参考方案2】:

Async task亲爱的做这整个工作

当应用程序尝试在其主线程上执行网络操作时会引发此异常。在 AsyncTask 中运行你的代码:(http://developer.android.com/reference/android/os/AsyncTask.html)

如何执行任务:

new RetrieveFeedTask().execute(urlToRssFeed);

不要忘记将这个添加到 AndroidManifest.xml 文件中:

<uses-permission android:name="android.permission.INTERNET"/>

【讨论】:

能解决问题吗? 我把代码放在异步任务中,它工作正常。我唯一要确认的是我使用异步任务的方式是否正常(检查我编辑的答案)。或者我应该把我的异步任务代码放在 makeRequest 方法中。 哦,所以现在你没有收到任何错误 r8 很好,唯一要记住的是,在异步任务中始终保持时间,这是我的回答帮助你获得成功 我的代码实现很好,或者有更好的方法来做到这一点【参考方案3】:

请从后台线程调用此方法。即使用 AsyncTask。然后从 doInBackground() 内部调用这个方法

【讨论】:

【参考方案4】:

您正在主线程上运行任务,请查看堆栈跟踪的第一行。

android.os.NetworkOnMainThreadException

根据这个答案:https://***.com/a/19323642/619673

您不能在主线程上发出网络请求。你会得到 您现在看到的错误。您需要使用 AsyncTask 或者您需要 创建一个新线程。就个人而言,我会使用 AsyncTask。当你使用 AsyncTask 可以使用 onPostExecute 方法将值返回给 主线程。 - 布莱恩

【讨论】:

以上是关于在进行 HTTP 调用时显示以下堆栈跟踪 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在检测到人脸时显示圆圈 - Android [重复]

从下拉列表中选择任何值时显示 3 个按钮 [重复]

当用户拒绝位置时显示位置请求提示

获取 $http 调用的完整调用堆栈跟踪

Angular Route 在浏览器刷新时显示原始 JSON

在程序中的任何位置生成 Java 堆栈跟踪 [重复]