我正在尝试连接到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;在空对象引用上
不是空指针异常的重复;虽然我的日志显示空指针异常,但我的问题发生在此之前。 空指针是真正问题的副作用。
答案 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中的代码会显示你如何发布你的名字价值。