繁体   English   中英

连接到服务器时出现异常的原因是什么

[英]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?

在这里,您在主线程中调用网络,这是不允许的。 您可以使用两种方法解决此问题

  1. 在 AsyncTask 的 doInBackground 中进行网络调用。
  2. 如果您不想使用 AsyncTask,请使用严格模式。

暂无
暂无

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

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