Java 即使启用了clicklistener类,按钮在单击后也没有响应
因此,我正在学习关于android开发的lynda课程,在学习URL连接教程之后,出于某种原因,讲师的代码会产生结果,而我的代码不会。这是我的档案 Main.javaJava 即使启用了clicklistener类,按钮在单击后也没有响应,java,android,eclipse,Java,Android,Eclipse,因此,我正在学习关于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.B
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_清单文件中有互联网权限。谢谢您的帮助。最好的方法是读取所有传入的消息并将其附加到字符串中。在下面的示例中,在
while循环中
,传入消息被读入字符串变量temp
,并附加行
变量。现在,该行在while
循环结束时包含完整消息,并设置为文本视图
//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();
}
现在,您可以观察日志猫中导致的异常。是的,这是一个
NetworkOnMainThreadException
无法在GUI线程中加载URL。你需要在不同的线程上做这些事情。这就是创建AsyncTask的原因
这是一个基于您的代码的工作应用程序,它在我的Nexus5(Android KitKat 4.4.4)上完美运行
**编辑**我试图从doInBackground()
方法修改TextEdit
的文本,这是不允许的。简单地评论下面的几行
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()});
}
});
}
}
您可能正在捕获并忽略一个异常。我猜您的空
catch
块隐藏了一个异常。正如@DavidConrad所说。抓住一个异常而对其完全不做任何处理从来都不是一个好主意。记录它,打印一条消息给用户,做一些事情大卫·康拉德是对的。您试图在GUI线程中运行URLConnection
,Android不允许这样做。你的异常捕获块是空的,你应该在那里添加一些东西,比如在日志中添加一个条目,比如log.e(“TAG”,“exception:+e.getMessage())
。你能解释一下你对OP的回答吗,这样他就可以学习而不是仅仅粘贴代码了?所以我在我的捕获块中添加了一个异常e。现在,当我查看logcat时,在输入edittext的“”url并按下按钮后,出现了一个异常:抛出了error null。因此,我可能没有完全理解这一点。。空错误是否意味着读卡器没有抓取任何内容@我想试着这么做。谢谢你安慰我自己的想法。@AliAslam,我不确定空错误是由哪里引起的。必须遵守日志。如果您可以使用错误消息更新问题,那就太好了。因此,在添加异常并试图找出问题发生的原因或位置后,这里是@codePGWait请求的日志猫的一个片段,这真是难以置信!为什么讲师的代码有效?这与他使用模拟器和我使用实际设备有关吗?除非android库在这些教程首次在线发布后有所改变。如果有人能告诉我为什么他的代码在没有使用aysnc任务管理器的情况下工作。当我学习HTTpclient教程时,我确实在该教程中使用了asyn任务,但在本教程中没有使用。是否有指向讲师代码的链接?Android不允许在GUI线程上加载URL。。。你的导师一定在用不同的思路做什么@AliAslam@AliAslam Ok,这不是代码,而是android版本。我认为这些教程是很久以前android开始普及的时候发布的。我没有密码,但我的密码和他一个字母一个字母地写的一模一样,除了包裹名称。结束讨论,让我总结一下问题。无法在UI活动上进行URL连接。因此,任何需要连接到internet的活动都必须使用异步任务管理器在backgorund中完成。这是由于安卓3.0及以上版本的变化。
<uses-permission android:name="android.permission.INTERNET" />