[英]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.