通过 android 连接到 web 服务时遇到问题

发布于 2024-12-29 17:51:15 字数 6839 浏览 1 评论 0原文

我目前在 Android 上连接到我的网络服务时遇到问题。我正在使用 Jetty Web 服务并使用 ANT 构建它。在我的笔记本电脑上,它运行良好并显示我数据库中的项目。但它似乎无法连接到我的 Android 应用程序。附件是代码和LOGCAT报告。

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
public class Android2Servlet extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dbtest);
TextView txtresp = (TextView)findViewById(R.id.servlet_response);

String url = "http://(MY LAPTOPS IP):8085/DB";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
try{
System.out.println("About to execute");
HttpResponse response = client.execute(request);
String helpedResp=HttpUnpack.request(response); 
System.out.println(helpedResp); 
txtresp.setText(helpedResp);
System.out.println(response);
}catch(Exception ex){
txtresp.setText("Failed!");
ex.printStackTrace();
}
} }

HTTP Unpack 文件

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
public class HttpUnpack {
public static String request(HttpResponse response){
String result = "";
try{ InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null){
str.append(line + "\n");
}
in.close();
result = str.toString();
}catch(Exception ex){
result = "Error retrieving response";
}
return result;
}
}

HTTP Unpack 和 Android2Servlet 不会导致任何错误,但文本框仅返回“失败!”。

LOGCAT 文件

W/System.err(1282): android.os.NetworkOnMainThreadException
W/System.err(1282):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
W/System.err(1282):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
W/System.err(1282):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
W/System.err(1282):     at libcore.io.IoBridge.connect(IoBridge.java:112)
W/System.err(1282):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
W/System.err(1282):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
W/System.err(1282):     at java.net.Socket.connect(Socket.java:842)
W/System.err(1282):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
W/System.err(1282):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
W/System.err(1282):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
W/System.err(1282):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
W/System.err(1282):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
W/System.err(1282):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
W/System.err(1282):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
W/System.err(1282):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
W/System.err(1282):     at myFood.myFood.Android2Servlet.onCreate(Android2Servlet.java:24)
W/System.err(1282):     at android.app.Activity.performCreate(Activity.java:4465)
W/System.err(1282):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
W/System.err(1282):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
W/System.err(1282):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
W/System.err(1282):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
W/System.err(1282):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
W/System.err(1282):     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(1282):     at android.os.Looper.loop(Looper.java:137)
W/System.err(1282):     at android.app.ActivityThread.main(ActivityThread.java:4424)
W/System.err(1282):     at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(1282):     at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(1282):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
W/System.err(1282):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
W/System.err(1282):     at dalvik.system.NativeStart.main(Native Method)

任何回应都会非常有帮助。

问候。

编辑:

我现在已经删除了网络访问并将其放入另一个 Java 类中。并称其为另一个类。它仍然返回相同的错误。还有其他建议吗?

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class androidconnectors {

    public static final String main(String args[]) throws Exception {


String txtresp = "";
try{
    String url = "http://(LAPTOPS IP):8085/Hello";
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
System.out.println("About to execute");
HttpResponse response = client.execute(request);
String helpedResp=HttpUnpack.request(response); // Http Unpack is not part of
System.out.println(helpedResp); // of HttpClient library
txtresp =(helpedResp);
System.out.println(response);
}catch(Exception ex){
    ex.printStackTrace();
}
return txtresp;
}
}

还有android类。

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class Settings extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dbtest);
        Button mybutton = (Button) findViewById(R.id.buttonpress);
        mybutton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                TextView txtresp = (TextView)findViewById(R.id.servlet_response);
            String[] args = null;
            try {
                String x = androidconnectors.main(args);
                txtresp.setText(x);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                txtresp.setText("Failed");
            }

            }
        });
}
}

I am currently having trouble connecting to my webservice on android. I am using a Jetty web service and building it using ANT. On my laptop it works perfectly and displays items from my database. However it won't seem to connect on my Android application. Attached is the code and LOGCAT report.

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
public class Android2Servlet extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dbtest);
TextView txtresp = (TextView)findViewById(R.id.servlet_response);

String url = "http://(MY LAPTOPS IP):8085/DB";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
try{
System.out.println("About to execute");
HttpResponse response = client.execute(request);
String helpedResp=HttpUnpack.request(response); 
System.out.println(helpedResp); 
txtresp.setText(helpedResp);
System.out.println(response);
}catch(Exception ex){
txtresp.setText("Failed!");
ex.printStackTrace();
}
} }

The HTTP Unpack File

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
public class HttpUnpack {
public static String request(HttpResponse response){
String result = "";
try{ InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null){
str.append(line + "\n");
}
in.close();
result = str.toString();
}catch(Exception ex){
result = "Error retrieving response";
}
return result;
}
}

The HTTP Unpack and the Android2Servlet do not cause any errors, however the text box only returns "Failed!".

LOGCAT file

W/System.err(1282): android.os.NetworkOnMainThreadException
W/System.err(1282):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
W/System.err(1282):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
W/System.err(1282):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
W/System.err(1282):     at libcore.io.IoBridge.connect(IoBridge.java:112)
W/System.err(1282):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
W/System.err(1282):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
W/System.err(1282):     at java.net.Socket.connect(Socket.java:842)
W/System.err(1282):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
W/System.err(1282):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
W/System.err(1282):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
W/System.err(1282):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
W/System.err(1282):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
W/System.err(1282):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
W/System.err(1282):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
W/System.err(1282):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
W/System.err(1282):     at myFood.myFood.Android2Servlet.onCreate(Android2Servlet.java:24)
W/System.err(1282):     at android.app.Activity.performCreate(Activity.java:4465)
W/System.err(1282):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
W/System.err(1282):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
W/System.err(1282):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
W/System.err(1282):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
W/System.err(1282):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
W/System.err(1282):     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(1282):     at android.os.Looper.loop(Looper.java:137)
W/System.err(1282):     at android.app.ActivityThread.main(ActivityThread.java:4424)
W/System.err(1282):     at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(1282):     at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(1282):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
W/System.err(1282):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
W/System.err(1282):     at dalvik.system.NativeStart.main(Native Method)

Any response would be greatly helpful.

Regards.

EDIT:

I have now removed the network access and put it in another Java class. And called it form another class. And it is still returning the same errors. Any other advice?

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class androidconnectors {

    public static final String main(String args[]) throws Exception {


String txtresp = "";
try{
    String url = "http://(LAPTOPS IP):8085/Hello";
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
System.out.println("About to execute");
HttpResponse response = client.execute(request);
String helpedResp=HttpUnpack.request(response); // Http Unpack is not part of
System.out.println(helpedResp); // of HttpClient library
txtresp =(helpedResp);
System.out.println(response);
}catch(Exception ex){
    ex.printStackTrace();
}
return txtresp;
}
}

And the android class.

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class Settings extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dbtest);
        Button mybutton = (Button) findViewById(R.id.buttonpress);
        mybutton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                TextView txtresp = (TextView)findViewById(R.id.servlet_response);
            String[] args = null;
            try {
                String x = androidconnectors.main(args);
                txtresp.setText(x);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                txtresp.setText("Failed");
            }

            }
        });
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

金兰素衣 2025-01-05 17:51:16

看起来,基于 快速谷歌搜索,自从 Honeycomb 你不应该在应用程序的主线程上执行网络访问(以提高响应能力)。

按照此处的建议创建另一个用于网络访问的线程。

It would seem, based on a quick google search, that since Honeycomb you are not supposed to execute network access on your app's main thread (to improve responsiveness).

Create another thread for network access as suggested here.

裂开嘴轻声笑有多痛 2025-01-05 17:51:16

您无法在 UI 线程上更好地使用 AsyncTask/Service/IntentService

NetworkOnMainThreadException

进行网络操作

当应用程序尝试执行某个操作时抛出的异常
在其主线程上进行网络操作。(自 API 11 起)

You can't do Network Operations on the UI Thread better use AsyncTask/Service/IntentService

NetworkOnMainThreadException

The exception that is thrown when an application attempts to perform a
networking operation on its main thread.(Since API 11)

穿透光 2025-01-05 17:51:16

要解决 StrictMode 问题,您需要在活动中使用以下代码 -

static{
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
StrictMode.setThreadPolicy(policy);  
}

To resovled StrictMode issue you need to use below code in your activity -

static{
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
StrictMode.setThreadPolicy(policy);  
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文