所以我正在关注Android开发的lynda课程,并在遵循URL连接教程之后,出于某种原因,教师的代码会产生结果但是我的代码没有。这是我有的文件
Main.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Main extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText et = (EditText) findViewById(R.id.editText1);
Button pressMe= (Button) findViewById(R.id.button1);
final TextView tv = (TextView) findViewById(R.id.textView1);
pressMe.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try{
URL url = null;
url = new URL(et.getText().toString());
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while((line = reader.readLine()) != null){
tv.append(line);
}
}
catch(Exception e){
}
}
});
}
}
我检查了我的代码并将其与教师进行了比较。我还在线检查了URL连接方法是否仍然有效,并且在研究之后它仍然有效。我没有使用HTTpClient的另一个教程,我从中得到了结果。但是出于学习目的,我想看看URL连接是否有效。我有我的Android_manifest文件中提供的互联网许可。谢谢你的帮助。
答案 0 :(得分:0)
最好的方法是读取所有传入的消息并将其附加到字符串。在下面的示例中,在while loop
中,传入的消息被读入字符串变量temp
,并附加line
变量。现在该行包含while
循环末尾的完整消息,并设置为textView
//String variable to hold the full message
String line ="";
//String variable to hold the incoming message part
String temp;
while((temp = reader.readLine()) != null){
//message appended to the line varable
line.append(temp);
}
//Set the value in line to the textView here
tv.setText(line);
如果您仍然收到错误,那么您可能会抓住并忽略错误。在这种情况下,您必须观察异常。要做到这一点,你可以做这样的事情
catch(Exception e) {
e.printStackTrace();
}
现在您可以观察logcat中导致的异常。
答案 1 :(得分:0)
是的,这是一个NetworkOnMainThreadException
!
您无法在GUI线程中加载URL。你需要在不同的线程上做这些事情。这就是创建AsyncTask的原因。
这是一款基于您的代码的应用程序,可在我的Nexus 5(Android KitKat 4.4.4)上完美运行。
**编辑**我尝试从TextEdit
方法修改doInBackground()
的文本,这是不允许的。简单地评论下面的行。
package com.example.stackoverflow27773175;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
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.EditText;
import android.widget.TextView;
public class MainActivity extends Activity
{
private EditText et;
private Button pressMe;
private TextView tv;
private class MyAsyncTask extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params)
{
StringBuilder sb = new StringBuilder();
URL url = null;
try
{
url = new URL(params[0]);
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
while((line = reader.readLine()) != null)
{
sb.append(line);
}
} catch (MalformedURLException e)
{
e.printStackTrace();
// Not allowed!
//tv.setText("Exception caught: MalformedURLException");
} catch (IOException e)
{
e.printStackTrace();
// Not allowed!
//tv.setText("Exception caught: IOException");
}
return sb.toString();
}
@Override
protected void onPostExecute(String result)
{
tv.setText(result);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.editText1);
pressMe = (Button) findViewById(R.id.button1);
tv = (TextView) findViewById(R.id.textView1);
pressMe.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute(new String[] {et.getText().toString()});
}
});
}
}
另外,请务必在android.permission.INTERNET
代码前的AndroidManifest.xml
中指定<application>
权限:
<uses-permission android:name="android.permission.INTERNET" />