我正在尝试调用我编写的方法。它编译除了一行......
public class http extends Activity {
httpMethod(); //will not compile
public void httpMethod(){
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://site/api/");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
String test = "hello";
TextView myTextView = (TextView) findViewById(R.id.myTextView);
myTextView.setText(test);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
}
我不是最好的java人,但我认为调用这样的方法会得到回应。然而,“Hello”没有显示......
如何正确调用该方法?
答案 0 :(得分:7)
编辑:只是为了不让任何人怀疑,这个答案只解决了为什么你会遇到编译时错误。它不解决你应该在哪个线程以及Android中的什么时间做的事情。
就我个人而言,我建议您暂时放下Android,在更简单的环境中学习Java(例如控制台应用程序),然后,当您对该语言感到满意时,重新访问Android并了解Android开发的所有要求 - 这显然不仅仅是语言。
您正试图直接在班级中将方法作为语句调用。你不能这样做 - 它必须是构造函数,初始化程序块,其他方法或静态初始化程序的一部分。例如:
// TODO: Rename this class to comply with Java naming conventions
public class http extends Activity {
// Constructor is able to call the method... or you could call
// it from any other method, e.g. onCreate, onResume
public http() {
httpMethod();
}
public void httpMethod() {
....
}
}
请注意,我仅 给出了此示例,以向您显示有效的Java类。它不意味着你应该实际从构造函数中调用该方法。
答案 1 :(得分:2)
httpMethod();
应该在分配给变量的其他方法/构造函数(或)中。我怀疑您的要求可能是在httpMethod()
(或)onCreate()
中调用onResume()
,因为您正在扩展活动。
答案 2 :(得分:1)
我想您可能需要详细了解Android Application Fundamentals,特别是Activity类和Activity
生命周期。
您的第一个问题与尝试在TextView
上设置测试字符串有关。
请勿尝试在构造函数调用的任何方法中执行此操作。也许更重要的是,忘记为您创建的任何扩展Activity
的类定义构造函数(或构造函数)。
为了能够操纵Activity
的UI元素,必须夸大内容视图。这可以使用setContentView(...)
隐式或使用LayoutInflater
隐式完成。最常见的做法是在onCreate(...)
中执行此操作,在此之前,尝试使用findViewById(...)
将返回null
。这就是为什么尝试使用Activity
构造函数中的UI执行任何操作都会失败,除非您在构造函数(或其调用的其他方法)中明确地夸大了布局。我不确定在这一点上甚至可以给布局充气,这肯定不是我推荐的东西,即使它是可能的。正如我所说,忘记Activities
的构造函数。
要做你想做的事情(出于测试目的),你需要做一些像......
public class HttpActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
httpMethod();
}
public void httpMethod() {
...
}
}
你的第二个问题,正如Maxim对你的问题的评论,即使我的例子适用于旧版本的Android,如果你试图在主线程(也就是UI线程)上执行网络操作,更新的版本会引发异常它们可能非常耗时,并且可能导致线程被阻塞。正如Maxim建议你应该使用AsyncTask
或其他Thread
而不是主(UI)线程。