httpclient (phpmyadmin) 无法在 Android 4.0+ 上运行
Posted
技术标签:
【中文标题】httpclient (phpmyadmin) 无法在 Android 4.0+ 上运行【英文标题】:httpclient (phpmyadmin) not working on Android 4.0+ 【发布时间】:2012-10-31 19:31:02 【问题描述】:我在下面使用此代码,它在 android 2.3.3 中完美运行。但是,在 4.0+ 中,它无法以某种方式连接到数据库。我看到一些关于你需要在异步课程中获得它的帖子。我也试过了,但我似乎无法正常工作。我可能用错了,但我很难理解。
public class connector extends Activity
/** Called when the activity is first created. */
TextView txt;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
getServerData(null);
//i use my real ip here
public String getServerData(String returnString)
System.out.println("going to connector class");
InputStream is = null;
final String KEY_121 = "http://10.0.0.128/connector.php";
String result = "";
//the year data to send
// ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
// nameValuePairs.add(new BasicNameValuePair("year","1970"));
//http post
try
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(KEY_121);
// httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
catch(Exception e)
Log.e("log_tag", "Error in http connection "+e.toString());
//convert response to string
try
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
sb.append(line + "\n");
is.close();
result=sb.toString();
catch(Exception e)
Log.e("log_tag", "Error converting result "+e.toString());
//parse json data
try
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++)
JSONObject json_data = jArray.getJSONObject(i);
Log.i("log_tag","ID: "+json_data.getInt("ID")+
", \nActara: "+json_data.getString("Actara")
);
//Get an output to the screen
returnString += "\n\t" + jArray.getJSONObject(i);
catch(JSONException e)
Log.e("log_tag", "Error parsing data "+e.toString());
return returnString;
Logcat 错误(4.0+):
11-12 12:02:35.658: E/log_tag(14083): Error in http connection android.os.NetworkOnMainThreadException
11-12 12:02:35.658: E/log_tag(14083): Error converting result java.lang.NullPointerException
11-12 12:02:35.663: E/log_tag(14083): Error parsing data org.json.JSONException: End of input at character 0 of
只有第一个错误行很重要,因为它无法连接到数据库,它给出了一个 nullPointer(第二个和第三个错误)。
这是我在异步中尝试过的:
public class connector extends Activity
/** Called when the activity is first created. */
TextView txt;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
new BackgroundAsyncTask().execute();
public class BackgroundAsyncTask extends
AsyncTask<Void, Integer, Void>
InputStream is = null;
final String KEY_121 = "http://10.0.0.128/connector.php";
String result = "";
String returnString = "";
protected void onPostExecute(Void result)
@Override
protected void onPreExecute()
System.out.println("onPreExecute");
protected Void doInBackground(String... params)
try
System.out.println("background in progress");
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(KEY_121);
// httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
catch(Exception e)
Log.e("log_tag", "Error in http connection "+e.toString());
//convert response to string
try
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
sb.append(line + "\n");
is.close();
result=sb.toString();
catch(Exception e)
Log.e("log_tag", "Error converting result "+e.toString());
//parse json data
try
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++)
JSONObject json_data = jArray.getJSONObject(i);
Log.i("log_tag","ID: "+json_data.getInt("ID")+
", \nActara: "+json_data.getString("Actara")
);
//Get an output to the screen
returnString += "\n\t" + jArray.getJSONObject(i);
catch(JSONException e)
Log.e("log_tag", "Error parsing data "+e.toString());
return null;
protected void onProgressUpdate(Integer... values)
@Override
protected Void doInBackground(Void... params)
// TODO Auto-generated method stub
return null;
有人可以帮助我吗?我不确定真正的原因是为什么它不适用于 4.0+。 如果您需要更多信息,请说出来,我会发布。 代码可能有点乱,我还没有真正“清理”它。
【问题讨论】:
【参考方案1】:好吧…… 在搜索了几个小时后,提出了这个问题,然后 10 分钟后,您找到了解决方案......
选项 1: 我添加了这一行:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
但我建议不要使用选项 1,这实际上是一个糟糕的解决方案。使用选项 2! //================================================= ============================ 选项 2:
使用本教程制作正确的ASyncTask: http://www.elvenware.com/charlie/development/android/SimpleHttpGetThread.html
//============================================== =============================== 使用 ASyncTask 作为最终任务(选项 2)。
【讨论】:
您永远不应该使用选项 1。始终使用 Asynctask 解决方案以获得更好的性能。【参考方案2】:android.os.NetworkOnMainThreadException
此错误来自 HoneyComb(3.0 或更高版本)。如文档所述,您无法在其主线程上执行网络操作。要解决这个问题,您必须使用处理程序或异步任务。 AFAIK 没有其他方法可以做到这一点。
更多详情请见WHY ICS Crashes your App
尝试使用下面的代码片段
new Thread()
public void run()
//do your Code Here
.start();
【讨论】:
【参考方案3】:自 Android 3.0 起,您不能在主线程上执行网络操作。为什么?因为网络问题会导致用户界面变慢。所以你必须在一个新线程中做所有的 http 东西。您走在正确的道路上,但您在 AsyncTask 中犯了一个错误。删除异步任务中的空 doInBackground 方法并在您的方法上写入 @Override。
【讨论】:
我找到了很好的教程:elvenware.com/charlie/development/android/… 这对我帮助很大【参考方案4】:为什么你在网络连接和网络服务的功能中传递null
。?
getServerData(null);
【讨论】:
因为我还不需要发送任何东西。我一点一点地测试。还是您认为这会导致 4.0+ 出现问题? (它适用于 2.3.3) 我在 2.2 中发现同样的问题可能是其他问题以上是关于httpclient (phpmyadmin) 无法在 Android 4.0+ 上运行的主要内容,如果未能解决你的问题,请参考以下文章