无法连接到WebService android.os.NetworkOnMainThreadException

时间:2015-05-14 21:24:09

标签: java php android android-asynctask

我正在尝试连接到Android应用中的PHP页面。我有权限设置。但是,我一直在Invalid ip address。我似乎需要AsyncTask。但是,我不知道如何设置它,也许是一个像这样单独运行的类:How to fix android.os.NetworkOnMainThreadException?,但在该链接上我不知道他们为什么要返回RSSFeed

实际网站链接有效。这只是我的应用程序抛出此错误。

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

nameValuePairs.add(new BasicNameValuePair("id", "123"));
nameValuePairs.add(new BasicNameValuePair("name", "test name"));
nameValuePairs.add(new BasicNameValuePair("family_memb_id", "456");

try
{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://mysite/insert.php");

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
 }

 catch(Exception e)
 {
     Log.e("app", "Failed 1: " + e.toString());
 }

 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();
 }

 catch(Exception e)
 {
     Log.e("app", "Failed 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("app", "Failed 3: " + e.toString());
 }

错误日志:

  

失败1:android.os.NetworkOnMainThreadException
  失败2:java.lang.NullPointerException:lock == null
  失败3:java.lang.NullPointerException:尝试调用虚方法&#39; int java.lang.String.length()&#39;在空对象引用上

不是空指针异常的重复;虽然我的日志显示空指针异常,但我的问题发生在此之前。 空指针是真正问题的副作用

1 个答案:

答案 0 :(得分:0)

是的,您认为自己需要AsyncTask才能走上正轨!

您必须在与主UI分开的线程中运行所有网络通信。它是这样做的,因为在UI线程中放置网络请求可能会导致糟糕的用户体验;基本上你的应用程序会在等待你正在联系的服务器的响应时挂起。

因此,获取单独的AsyncTask来处理网络通信是可行的方法。

编辑Here's深入了解如何开始使用AsyncTask中的网络通信。

另一个编辑:您的网络代码将进入AsyncTask。假设您传入NameValuePairs,您的代码可能看起来像这样。

/* somewhere in your UI thread */
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

nameValuePairs.add(new BasicNameValuePair("id", "123"));
nameValuePairs.add(new BasicNameValuePair("name", "test name"));
nameValuePairs.add(new BasicNameValuePair("family_memb_id", "456");
AsyncTask httpAsyncTask = new HttpAsyncTask();
httpAsyncTask.execute(nameValuePairs);


/* your AsyncTask */

public class AsyncTask HttpAsyncTask extends AsyncTask<ArrayList<NameValuePair>, Void, Boolean>(){
    @Override
    protected Boolean doInBackground(ArrayList<NameValuePair>... params)
    {
         ArrayList<NameValuePair> nameValuePairs = params[0];
         /* Your HTTP Code Here */
    }

}

值得指出的是使用HttpURLConnection is recommended instead of DefaultHttpClient。它的API更易于使用,它仍在积极改进,效率更高,从而提高了速度并节省了电池。

如果你决定切换到HttpURLConnection,那么this SO answer中的代码会显示你如何发布你的名字价值。