Java 即使启用了clicklistener类,按钮在单击后也没有响应

Java 即使启用了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

因此,我正在学习关于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_清单文件中有互联网权限。谢谢您的帮助。

最好的方法是读取所有传入的消息并将其附加到字符串中。在下面的示例中,在
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" />