尝试将在模拟器上运行的Android App连接到在本地主机上运行的Servlet

问题描述

我正在实现一个Android App,该App必须与某些Java servlet进行通信才能获取数据。 应用程序和Servlet之间的连接由httpRequest建立。 Java Servlet在配置如下的Tomcat服务器上运行:

java servlet代码正确运行,我在桌面版本的App中对其进行了测试。 问题是当我尝试将应用程序连接到servlet时。 这里是管理与Servlet的连接的android活动的代码

    private String user;
    String DEBUG_TAG = "debug";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        onStart();
    }

    public void log(View view) { //action performed when users click on login button

        EditText username= findViewById(R.id.username);
        EditText password= findViewById(R.id.password);
        String account_username=username.getText().toString();
        String account_password=password.getText().toString();

        String URL = "http://10.0.2.2:8080/Ripetizioni/Login/?uname=" + account_username+ "&psw="+account_password;
        if(isOnLine()){
            new ExecuteLogin().execute(URL);
        }
        switch(user) {
            case "client":
                Intent i = new Intent(this,UserActivity.class);
                startActivity(i);
                break;
            case "administrator":
                Intent ii = new Intent(this,AdminActivity.class);
                startActivity(ii);
                break;
            default:
                break;
        }
    }

    private class ExecuteLogin extends AsyncTask<String,Void,String>{
        @Override
        protected String doInBackground(String... params) {
            try {
                return getUser(params[0]);
            } catch (Exception e) {
                e.printstacktrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(String s) {
            setUser(s);
        }

    }

    public String getUser(String myurl) {
        HttpURLConnection conn = null;
        try {
            URL url = new URL(myurl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(10000); //milliseconds
            conn.setConnectTimeout(15000); //milliseconds
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.connect();
            int response = conn.getResponseCode();
            Log.d(DEBUG_TAG,"The response is: " + response);
            return readIt(conn.getInputStream());
        } catch (Exception ex) {
            Log.e("async",ex.getMessage());
            ex.printstacktrace();
            return null;
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }

    private String readIt(InputStream stream) throws IOException {
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(stream));
        String line;
        StringBuilder result = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            result.append(line).append("\n");
        }
        return result.toString();
    }

    public boolean isOnLine() {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            assert connMgr != null;
            NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
            return (networkInfo != null && networkInfo.isConnected());
        } else {
            assert connMgr != null;
            Network[] nets = connMgr.getAllNetworks();
            Context context = getApplicationContext();
            for (Network net : nets) {
                NetworkInfo info = connMgr.getNetworkInfo(net);
                assert info != null;
                String tipo = info.getTypeName();
                boolean connessa = info.isConnected();
                if (connessa) {
                    String tip = "";
                    if (info.getType() == connMgr.TYPE_MOBILE) {
                        tip = "Mobile";
                    } else if (info.getType() == connMgr.TYPE_WIFI) {
                        tip = "WiFi";
                    }
                    Log.d(DEBUG_TAG,"Mobile connected: " + tip);
                    String text = "internet connessa! " + tipo + " " + tip;
                    text += info.toString();
                    Toast toast = Toast.makeText(context,text,Toast.LENGTH_SHORT);
                    toast.show();
                    return true;
                }
            }
            Toast toast = Toast.makeText(context,"NO RETE",Toast.LENGTH_SHORT);
            toast.show();
            return false;
        }
    }
}

代码在“ getUser”方法内部出现一些错误,这是控制台日志:

D/AndroidRuntime: Shutting down VM
D/NetworkSecurityConfig: No Network Security Config specified,using platform default
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: it.repetition.test,PID: 10750
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
        at android.view.View.performClick(View.java:6597)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:6597) 
        at android.view.View.performClickInternal(View.java:6574) 
        at android.view.View.access$3100(View.java:778) 
        at android.view.View$PerformClick.run(View.java:25885) 
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference
        at it.repetition.test.LoginActivity.log(LoginActivity.java:73)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
        at android.view.View.performClick(View.java:6597) 
        at android.view.View.performClickInternal(View.java:6574) 
        at android.view.View.access$3100(View.java:778) 
        at android.view.View$PerformClick.run(View.java:25885) 
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

如果我调试代码,则在“ getUser”方法中会出现如下异常:

java.io.FileNotFoundException: http://10.0.2.2:8080/Ripetizioni/Login/?uname=Mario&psw=012abc

可能我做了一些配置错误或类似的事情,但是我对Android并没有太多练习,所以我不明白如何解决这些错误。 感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)