2013-01-10 82 views
1

我想从一个android应用程序发送一个字符串到一个servlet,然后检索到我的android应用程序的字符串,但是当我尝试调用该servlet它强制关闭我 和我不知道为什么(IM很新的Android,这是一个实践锻炼对我来说) 这里是我的android简单的应用程序:发送一个字符串从android的

ANDROID

package com.theopentutorials.android; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
public class HttpGetServletActivity extends Activity implements OnClickListener { 
Button button; 
TextView outputText; 
public static String request = "kjo ishte e gjitha"; 
public static final String URL = ("http://10.0.2.2:8080/HttpGetServlet/HelloWorldServlet?param1=" + request); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    findViewsById(); 
    button.setOnClickListener(this); 
} 
private void findViewsById() { 
    button = (Button) findViewById(R.id.button); 
    outputText = (TextView) findViewById(R.id.outputTxt); 
} 
public void onClick(View view) { 
    GetXMLTask task = new GetXMLTask(); 
    task.execute(new String[] { URL }); 
} 
private class GetXMLTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 
     String output = null; 
     for (String url : urls) { 
      output = getOutputFromUrl(url); 
     } 
     return output; 
    } 
    private String getOutputFromUrl(String url) { 
     StringBuffer output = new StringBuffer(""); 
     try { 
      InputStream stream = getHttpConnection(url); 
      BufferedReader buffer = new BufferedReader(
        new InputStreamReader(stream)); 
      String s = ""; 
      while ((s = buffer.readLine()) != null) 
       output.append(s); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     return output.toString(); 
    } 

    private InputStream getHttpConnection(String urlString) 
      throws IOException { 
     InputStream stream = null; 
     URL url = new URL(urlString); 
     URLConnection connection = url.openConnection(); 
     try { 
      HttpURLConnection httpConnection = (HttpURLConnection) connection; 
      httpConnection.setRequestMethod("GET"); 
      httpConnection.connect(); 

      if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
       stream = httpConnection.getInputStream(); 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return stream; 
    } 
    @Override 
    protected void onPostExecute(String output) { 
     outputText.setText(output); 
    } 
} 
} 

,这里是我的简单的servlet

SERVLET

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
@WebServlet("/HelloWorldServlet") 
public class HelloWorldServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

public HelloWorldServlet() { 
    super(); 
} 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) 
     throws ServletException, IOException { 
    String par1 = request.getParameter("param1"); 
    PrintWriter out = response.getWriter(); 
    out.println(par1); 
} 
} 

而且logcat的日志错误说

01-10 13:36:50.014: E/AndroidRuntime(1187): FATAL EXCEPTION: AsyncTask #1 
01-10 13:36:50.014: E/AndroidRuntime(1187): java.lang.RuntimeException: An error occured while executing doInBackground() 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.lang.Thread.run(Thread.java:856) 
01-10 13:36:50.014: E/AndroidRuntime(1187): Caused by: java.lang.NullPointerException: lock == null 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.io.Reader.<init>(Reader.java:64) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.io.InputStreamReader.<init>(InputStreamReader.java:122) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.io.InputStreamReader.<init>(InputStreamReader.java:59) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at com.theopentutorials.android.HttpGetServletActivity$GetXMLTask.getOutputFromUrl(HttpGetServletActivity.java:64) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at com.theopentutorials.android.HttpGetServletActivity$GetXMLTask.doInBackground(HttpGetServletActivity.java:54) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at com.theopentutorials.android.HttpGetServletActivity$GetXMLTask.doInBackground(HttpGetServletActivity.java:1) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
01-10 13:36:50.014: E/AndroidRuntime(1187):  ... 4 more 

行的也有人有什么想法? 非常感谢您的帮助! 祝您有美好的一天!

+0

发布您的logcat可以是有用 – ben75

+0

谢谢您的回复,我刚刚发布的logcat的,但我不能充分理解它 –

回答

2

您需要添加的互联网访问权限

<uses-permission android:name="android.permission.INTERNET"/> 

我发现,你应该使用类URLEncoder来编码URL,因为您的网址包含空格。请检查http://developer.android.com/reference/java/net/URLEncoder.html

+0

我已经有了,我试图直接从servlet发送servlet响应像一个字符串,它的工作.. –

+0

我想通了它是由param1值的空间造成的。尝试转义它像kjoi%20shtegjitha – Kai

+0

我曾尝试发送它就像一个单词像'公共静态最终字符串URL = (“http://10.0.2.2:8080/HttpGetServlet/HelloWorldServlet?param1=CkemiBota”); '所以不需要urlEncoder,但没有什么,再次同样的错误:/ –

1

你忘了从android应用程序中设置param1。

connection.setRequestProperty("param1", "Your String Value"); 

然后你会从Servlet中得到回应的值。

+0

sure.go上.. @ p3rand0r –

+0

谢谢您的答复,但我还有2问题,我不知道我必须把这行代码,在这之后我也想编辑'public static final String URL =(“http://10.0.2.2:8080/HttpGetServlet/HelloWorldServlet?param1=” + request);'to'public static final String URL =(“http://10.0.2.2:8080/HttpGetServlet/HelloWorldServlet”);'对吗?另外我发布了logcat,如果这是为了任何帮助。 –

+0

作为你的setRequestProperty,那么你会得到param1值到你的servlet,因此你也会得到一个response.just设置requestproperty线,你完成了。保持所有其他线路。 –

相关问题