1

自分が書いたメソッドを呼び出そうとしています。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()

于 2012-07-09T19:03:57.097 に答える
1

Androidアプリケーションの基礎、特にアクティビティクラスとライフサイクルについてもっと学ぶ必要があると思い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() {
        ...
    }
}

2番目の問題は、マキシムの質問に対するコメントですが、私の例は古いバージョンのAndroidでも機能しますが、メインスレッド(別名UIスレッド)でネットワーク操作を実行しようとすると、例外がスローされる可能性があります。時間がかかり、スレッドがブロックされる可能性があります。マキシムが示唆しているように、これはメイン(UI)スレッド以外のAsyncTaskまたはで行う必要があります。Thread

于 2012-07-09T20:12:36.363 に答える