[英]what the cause of exception when connecting to the server
我正在尝试连接到服务器,但应用程序未连接,我添加了权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
这是 url 地址(您可以连接到它)
http://justedhak.comlu.com/insert.php
这是错误:
06-30 08:21:15.332: I/System.out(4270): main calls detatch()
06-30 08:21:15.332: E/Fail 1(4270): android.os.NetworkOnMainThreadException
06-30 08:21:15.337: E/Fail 2(4270): java.lang.NullPointerException: lock == null
06-30 08:21:15.337: E/Fail 3(4270): java.lang.NullPointerException
06-30 08:21:16.802: I/System.out(4270): main calls detatch()
06-30 08:21:16.802: E/Fail 1(4270): android.os.NetworkOnMainThreadException
06-30 08:21:16.807: E/Fail 2(4270): java.lang.NullPointerException: lock == null
06-30 08:21:16.807: E/Fail 3(4270): java.lang.NullPointerException
这是我的代码:
public void insert()
{
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("id",id));
nameValuePairs.add(new BasicNameValuePair("name",name));
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://justedhak.comlu.com/insert.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
Log.e("pass 1", "connection success ");
}
catch(Exception e)
{
Log.e("Fail 1", e.toString());
Toast.makeText(getApplicationContext(), "Invalid IP Address",
Toast.LENGTH_LONG).show();
}
try
{
BufferedReader reader = new BufferedReader
(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
result = sb.toString();
Log.e("pass 2", "connection success ");
}
catch(Exception e)
{
Log.e("Fail 2", e.toString());
}
try
{
JSONObject json_data = new JSONObject(result);
code=(json_data.getInt("code"));
if(code==1)
{
Toast.makeText(getBaseContext(), "Inserted Successfully",
Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(getBaseContext(), "Sorry, Try Again",
Toast.LENGTH_LONG).show();
}
}
catch(Exception e)
{
Log.e("Fail 3", e.toString());
}
}
可能缺少什么?
Android UI 被设计为单个线程(主 UI 线程)。 因此,为了防止 UI 中断,您不能在 UI 线程中进行网络调用。
自 Androidv2.3(我认为)以来,他们引入了此异常,因此不正确的编码实践不会影响整体 Android 体验。
您必须在单独的线程中进行调用。 Android 为传统的 Java Runnable(或线程)提供了一个简单的包装器,称为(非常有创意的) AsyncTask 。 这是文档的链接。 (你也可以问问谷歌大叔,他什么都知道)
一个简短的示例用法(无耻地从 Android Dev 网站复制):
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
然后从您的 Activity 通话中
new DownloadFilesTask().execute(url1, url2, url3);
为此,您需要使用 Asynchtask 或线程。 或查看以下链接如何修复 android.os.NetworkOnMainThreadException?
在这里,您在主线程中调用网络,这是不允许的。 您可以使用两种方法解决此问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.