我的应用程序在emulator上运行得很好,但当我导出后在我的智能手机(galaxy s3)上运行它时,它会在这个活动中崩溃,因为有HTTP连接!问题出在哪里?代码还是导出?当我点击连接按钮时,它崩溃了。
public class login extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
final MyApplication MyApp = (MyApplication) this.getApplication();
ViewGroup layout = (ViewGroup) findViewById(R.id.login);
MyApp.changeFonts(layout);
if (!MyApp.IsConnect())
{Toast.makeText(getBaseContext(), "Connessione non disponibile", Toast.LENGTH_SHORT).show();}
final Button fer = (Button) findViewById(R.id.invia);
fer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String url = "http://corraphp.altervista.org/server.php";
EditText txtNome = (EditText) findViewById(R.id.txtNome);
EditText txtTessera = (EditText) findViewById(R.id.txtCodice);
String cognome = txtNome.getText().toString();
String tessera = txtTessera.getText().toString();
ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("cognome",cognome));
pairs.add(new BasicNameValuePair("tessera", tessera));
if ((cognome.equals("")) && (tessera.equals("")))
{Toast.makeText(getBaseContext(), "Inserire il cognome e la tessera", Toast.LENGTH_LONG).show(); return;}
else
{
if (cognome.equals(""))
{ Toast.makeText(getBaseContext(), "Inserire il cognome", Toast.LENGTH_LONG).show(); return;}
if (tessera.equals(""))
{ Toast.makeText(getBaseContext(), "Inserire la tessera", Toast.LENGTH_LONG).show(); return;}
}
InputStream is = null;
StringBuilder sb=null;
String result=null;
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httppost.setEntity(new UrlEncodedFormEntity(pairs));
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);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line="0";
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());
}
//paring data
try{
JSONArray jArray = new JSONArray(result);
JSONObject json_data=null;
int id = 0;
String Cognome = "";
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
id = json_data.getInt("id");
Cognome = json_data.getString("cognome");
}
MyApp.setUtente(json_data.getInt("id"));
MyApp.setCognome(json_data.getString("cognome"));
MyApp.setTessera(tessera);
Intent i = new Intent(login.this, saluto.class);
startActivity(i);
finish();
}catch(JSONException e1){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(login.this);
alertDialogBuilder.setTitle("error");
alertDialogBuilder.setMessage("Cognome / Tessera errati");
alertDialogBuilder.setNeutralButton("ok",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
// show alert
alertDialog.show();
}catch (ParseException e1){
e1.printStackTrace();
}
}
});}}
从您的代码中可以看出,网络操作似乎在onClickListener内部,在应用程序的UI线程/主线程上访问。
在模拟器和设备上检查O.S.版本:
为什么你的应用程序会在Android 3.0及以上版本上崩溃,但在Android 2上运行良好。x是因为蜂巢和冰淇淋三明治(以及更高版本),O.S.对UI线程的滥用更加严格。例如,当运行HoneyComb或更高版本的Android设备在UI线程上检测到网络访问时,将抛出一个NetworkOnMainThreadException:
E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example/com.example.ExampleActivity}: android.os.NetworkOnMainThreadException
关于为什么会发生这种情况的解释在Android开发人员的网站上有很好的记录:
当应用程序尝试在其主线程上执行网络操作时,会引发NetworkOnMainThreadException。这仅适用于针对蜂巢SDK或更高版本的应用程序。针对早期SDK版本的应用程序可以在其主事件循环线程上进行联网,但这是非常不鼓励的。
经过:
为什么应用程序会崩溃或工作取决于O.S。
尝试AsyncTask以避免NetworkOnMainThread
为什么不使用严格模式替代方案作为解决方案,只进行调试(我建议避免这种情况,实际上,你知道现在的问题是什么):
解决它至关重要,而不是通过设置线程策略
它可以在仿真器和真实设备(android版本4)上工作,但不能在真实设备(android版本7.0)上工作 相关代码: logcat: 05-23 10:31:39.464 173 42-17342/laftel.net.laftel E/AndroidRuntime:致命异常:主进程:laftel.net.laftel,pid:17342 java.lang.nullPointerExcepti
我是爱奥尼亚的新手,如果我的问题很愚蠢,请原谅我。在开发过程中,我使用浏览器来显示和测试我的应用程序,一切都正常工作,没有任何问题,但是当我在android设备上的Ionic DevApp上测试我的应用程序时,应用程序无法与后端通信(REST API)。每次我发送请求(如登录请求)时,系统都会响应。 console.log显示错误信息: 我的申请: 前端:离子角 后端(RESTAPI):JavaS
我已经在NetBeans中创建了一个Java项目,自动构建的分发文件(.jar)在我的Ubuntu15.04AMD64机器上运行得非常好。 我想在发布它之前确保它在windows上运行,但在windows 7 32位机器上测试后,我发现它不工作。下面是错误消息的屏幕截图。 我可以猜到一些问题--因为它谈到了一个。regex错误。我并没有在代码中真正使用regex,而是使用string.split。
问题内容: 我最近遇到了这个问题: java.util.NoSuchElementException线程“ Thread-4”中的异常java.lang.IllegalStateException:不在FX应用程序线程上;仅在FX应用程序线程上有效。currentThread =线程4 该代码适用于jdk7,但不适用于jdk8,该代码如下所示: 然后我从以下代码中调用此线程: 我要做的就是从其他具
我正在为我的Android应用程序使用Firebase身份验证和数据库。所有的一切都可以在一个仿真器上运行(Nexus 5X API 26、Nexus 6 API 26、Galaxy Nexus API 24)。当我在我的个人Galaxy S6 Edge API 24上启动应用程序时,我的Firebase相关项目都没有工作。 没有崩溃错误。 很抱歉写了这么长的日志,我似乎弄不明白问题所在。请让我知