import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLEncoder;
import com.google.gson.Gson;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
public class SampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageButton button = (ImageButton) findViewById(R.id.imageButton1);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
doSomething();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
public void doSomething() throws Exception {
EditText search2 = (EditText)findViewById(R.id.editText1);
TextView urltext = (TextView)findViewById(R.id.textView1);
String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
String search = search2.toString() + "site:mysite.com";
String charset = "UTF-8";
URL url = new URL(google + URLEncoder.encode(search, charset));
Reader reader = new InputStreamReader(url.openStream(), charset);
GoogleResults results = new Gson().fromJson(reader, GoogleResults.class);
String voidurlresult = results.getResponseData().getResults().get(0).getUrl().toString();
urltext.setText(voidurlresult);
}
}
请看一下上面的代码.....代码有什么问题。当我点击按钮时我什么都没得到。当我点击按钮我想得到第一个谷歌结果的网址...如果有人可以帮助我,我会很感激
答案 0 :(得分:3)
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
SampleActivity.this.doSomething();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
将try语句中包含的语句更改为this。这将确保引用正确的类来调用该方法。
答案 1 :(得分:0)
您的代码是正确的,它看起来似乎没有任何方法让您知道该方法被调用。请考虑向您的doSomething()
方法添加某种通知,以便了解该方法是否被调用。
做这样的事情:
public void doSomething() throws Exception {
// Show toast when method is called:
Toast.makeText(this, "doSomething() is getting called", Toast.LENGTH_LONG).show();
// the rest of doSomthing()
}
答案 2 :(得分:0)
虽然代码看起来正确,但如果在设置的侦听器块之前发生错误,则可能无法设置按钮单击侦听器。将代码包装在错误陷阱中以确定是否发生错误。这也是很好的编码实践 - 特别是在访问外部资源时。
也可能是被叫方法犯了错误而没有完成任务。您也应该在该程序中设置一个陷阱。
答案 3 :(得分:0)
抱歉我的英语不好。
实际上,您可以使用StackTrace获取当前方法的名称。
以下是一个示例:
public class Test {
public static void main(String args[]) {
trace(Thread.currentThread().getStackTrace());
new Test().doit();
trace(Thread.currentThread().getStackTrace());
}
public void doit() {
trace(Thread.currentThread().getStackTrace());
doitagain();
}
public void doitagain() {
trace(Thread.currentThread().getStackTrace());
}
public static void trace(StackTraceElement e[]) {
boolean doNext = false;
for (StackTraceElement s : e) {
if (doNext) {
System.out.println(s.getMethodName());
return;
}
doNext = s.getMethodName().equals("getStackTrace");
}
}
}
我忘了提到这种方法可能不适用于所有情况。
答案 4 :(得分:0)
我想我要迟到这个派对,但它可能对其他人有帮助。
您无法在主线程上执行网络操作。您的代码在系统引发NetworkOnMainThreadException
的情况下无声地失败。如果您运行此代码并检查应用程序的LogCat输出,您将注意到异常。
解决方案是在工作线程上执行网络操作。您可以在此用例中使用AsyncTask
。