当前位置: 首页 > 知识库问答 >
问题:

应用程序可以在emulator上运行,但不能在智能手机上运行

都阳
2023-03-14

我的应用程序在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();
            }
        }
    });}}

共有1个答案

宰父远
2023-03-14

从您的代码中可以看出,网络操作似乎在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相关项目都没有工作。 没有崩溃错误。 很抱歉写了这么长的日志,我似乎弄不明白问题所在。请让我知