Android中的调用方法

时间:2012-07-09 19:01:47

标签: java android

我正在尝试调用我编写的方法。它编译除了一行......

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”没有显示......

如何正确调用该方法?

3 个答案:

答案 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)线程。