簡體   English   中英

單擊后,即使啟用了clicklistener類,按鈕也沒有響應

[英]Button is not responding after clicking even with clicklistener class enabled

因此,我正在學習有關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文件中嵌入了Internet權限。 感謝您的幫助。

最好的方法是讀取所有傳入的消息並將其附加到字符串。 在下面的示例中,在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中引起的異常。

是的,這是一個NetworkOnMainThreadException

您不能在GUI線程中加載URL。 您需要在其他線程上執行該操作。 這就是創建AsyncTask的原因。

這是一個根據您的代碼運行的應用程序,可在我的Nexus 5(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()});
             }
        });
    }
}

另外,請確保在您的AndroidManifest.xml<application>標記之前指定android.permission.INTERNET權限:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM