在进行 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 调用时显示以下堆栈跟踪 [重复]的主要内容,如果未能解决你的问题,请参考以下文章