1

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

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 人,但我认为像这样调用该方法会得到响应。“你好”没有显示但是......

如何正确调用该方法?

4

3 回答 3

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 类。这并不意味着您实际上应该从构造函数中调用该方法。

于 2012-07-09T19:03:45.970 回答
2
httpMethod();       

应该在分配给变量的其他方法/构造函数(或)内。我怀疑您的要求可能是调用httpMethod()任一onCreate()(或)调用,onResume()因为您正在扩展 Activity。

于 2012-07-09T19:03:57.097 回答
1

我认为您可能需要了解更多有关 Android应用程序基础知识,尤其是Activity类和Activity生命周期的信息。

您的第一个问题与尝试在您的TextView.

不要尝试在构造函数调用的任何方法中执行此操作。也许更重要的是,忘记为您创建的任何扩展类定义构造函数(或构造函数)Activity

为了能够操作 的 UI 元素Activity,内容视图必须被膨胀。这是通过隐式使用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)线程以外的某个线程上执行此操作。

于 2012-07-09T20:12:36.363 回答