0

単純な HTTP get を使用して Web ページから文字列を読み込もうとしています。しかし、エミュレーターでアプリを実行すると、厳密なポリシー違反が発生し、何も表示されません。ポリシー違反は「policy=31 violation=4」としてリストされます。permitNetwork() を ThreadPolicy の初期化に追加すると、LogCat から google.com がアドレスに解決されないことがわかります。明らかに、何かが欠けていますが、これがネットワーク操作を処理する方法であるという印象を受けました。

編集: HttpExampleActivity.java を変更しました。次のようになりました。

package com.android.httpexample;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy.Builder;
import android.widget.TextView;

public class HttpExampleActivity extends Activity {
    TextView httpStuff;

     @Override
        public void onCreate(Bundle savedInstanceState) {
         StrictMode.ThreadPolicy policy = new Builder().detectAll().penaltyLog().build(); 
         StrictMode.setThreadPolicy(policy);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            new Thread(new Runnable() { 
                public void run() {

                    httpStuff = (TextView) findViewById(R.id.tvHttp);
                    httpStuff.post(new Runnable(){
                        public void run(){

                    GetProcedure test = new GetProcedure();
                    String returned;
                    try{
                        returned = test.getInternetData();
                        httpStuff.setText(returned);
                    } catch(Exception e){
                        e.printStackTrace();
                    }
                        }
                    });
                }
            }).start();


     }
}

私の GetProcedure.java には、次のものがあります。

package com.android.httpexample;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class GetProcedure {
    public String getInternetData() throws Exception {
        BufferedReader in = null;
        String data = null;
        try{
            HttpClient client = new DefaultHttpClient();
            URI website = new URI("http://google.com");
            HttpGet request = new HttpGet();
            request.setURI(website);
            HttpResponse response = client.execute(request);
            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String l = "";
            String nl = System.getProperty("line.separator");
            while((l = in.readLine()) != null)
            {
                sb.append(l + nl);
            }
            in.close();
            data = sb.toString();
            return data;
        }finally{
            if(in != null){
                try{
                    in.close();
                    return data;
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}
4

1 に答える 1

3

ネットワーク アクティビティを実行する別のスレッドを使用する必要があります。ICS 以降、Android は UI スレッドでのネットワーキングを許可していません。5秒前。

タスクを解決する良い方法は、すべてを処理する AsyncTask か、アクティビティのリスナーを持つ Thread です。

詳細なアドバイスについては、 Painless Threading Topic を確認してください。

于 2012-06-17T15:25:49.553 に答える