0

このコードをテストしたところ、2.2 と 2.3.3 では正常に動作しますが、4.0 ではクラッシュします。

問題は http リクエストにあるようです。理由はありますか?

public class Rezultat extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    //http post
    InputStream is=null;
    try{

            String url="http://google.com";
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
    }catch(Exception e){
            Log.e("log_tag", "Error in http connection "+e.toString());
    }
    //convert response to string
    try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            is.close();

            result=sb.toString();

    }catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
    }
4

3 に答える 3

3

e.printstacktrace()は次のことを示します。

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

アプリケーションがメインスレッドでネットワーク操作を実行しようとしたときにスローされる例外。

これは、HoneycombSDK以降を対象とするアプリケーションに対してのみスローされます。以前のSDKバージョンを対象とするアプリケーションは、メインのイベントループスレッドでネットワークを構築できますが、お勧めできません。応答性のための設計のドキュメントを参照してください。

private class DownloadFromUrlTask extends AsyncTask<String, Void, Bitmap> {

    protected void onPreExecute() {
        mDialog = ProgressDialog.show(ChartActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    protected String doInBackground(String... urls) {
        //All your network stuff here.
        return result
    }
}
于 2012-12-18T20:16:17.460 に答える
1

メインスレッドで(低速の可能性がある)ネットワーク操作を実行しています。ターゲットSDKが11以上の場合、NetworkOnMainThreadExceptionこの動作によりUIがブロックされ、アプリが応答しなくなる可能性があるため、がスローされます。

を使用しAsyncTaskてこれを回避し、にデータをロードすることができますdoInBackground(..)

于 2012-12-18T20:15:51.923 に答える
1

通常、クラッシュについて質問するときはスタックトレースを投稿する必要がありますが、この場合はメインUIスレッドでネットワーク操作を行っています。これは推奨されておらず、例外がスローされるようになりました。代わりに、おそらくAsyncTaskを介して、別のスレッドでそれを実行します。

于 2012-12-18T20:16:07.103 に答える