单击甚至启用clicklistener类后按钮没有响应

时间:2015-01-05 03:53:30

标签: 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.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文件中提供的互联网许可。谢谢你的帮助。

2 个答案:

答案 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" />