1

エラーが発生しています: android.os.NetworkOnMainThreadException. 私のアプリはエミュレーターで正常に動作しています。次に、一部のデバイスで確認します。Android バージョン 2.3.5 では正常に動作していますが、バージョン 4.0.3 の 2 番目のデバイスではエラーが発生します。次のように AsyncTask を使用しています。

private class TheTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(Main.this, "",
                "Loading. Please wait...", true);
    }

    @Override
    protected String doInBackground(String... params) {

        request = new SoapObject(NAMESPACE, METHOD_NAME);

        userid = new PropertyInfo();
        userid.setName("UserId");
        userid.setValue(UserId);
        userid.setType(String.class);
        request.addProperty(userid);

        SoapSerializationEnvelope envp = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envp.dotNet = true;
        envp.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envp);
            SoapPrimitive response = (SoapPrimitive) envp.getResponse();
            Response = response.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return Response;
    }

    @Override
    protected void onPostExecute(String result) {

        if (dialog != null) {
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }

        try {
            splitData = result.split("\\;");
            username.setText(splitData[0]);

            URL newurl = new URL("" + WebsiteURL + "/images/profileImg/"
                    + splitData[1] + "");
            Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
                    .openConnection().getInputStream());
            userphoto.setImageBitmap(mIcon_val);
        } catch (Exception e) {
            username.setText(e.toString());
        }

    }
}
4

5 に答える 5

1
try {
        URL newurl = new URL("" + WebsiteURL + "/images/profileImg/"
              + splitData[1] + "");
        Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
                  .openConnection().getInputStream());
        } catch (Exception e) {

    }

onPostExecute()あるはずですdoInBackground()

そしてonPostExecute()

if(mIcon_val != null){
   userphoto.setImageBitmap(mIcon_val);
}
于 2013-05-28T11:11:04.870 に答える
1

メインの UI スレッドでネットワーク関連の操作を実行しています。

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

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

これは、Honeycomb SDK 以降を対象とするアプリケーションに対してのみスローされます以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、推奨されません

     Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
                .openConnection().getInputStream()); 

onPostExecute(param) は UI スレッドで呼び出されます。したがって、上記をバックグラウンド スレッドで呼び出される doInBackground().doInbackground に移動します。doinBackground() で ui を更新しないことを忘れないでください。doInbackground 計算の結果は、onPostExecute(result) へのパラメーターです。したがって、onPostExecute(result) で ui を更新できます。

以下のリンクの「The 4 steps」セクションの下のトピックを確認してください。

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

于 2013-05-28T11:11:52.380 に答える
1

このコードを呼び出しています:

Bitmap mIcon_val = BitmapFactory.decodeStream(newurl .openConnection().getInputStream());

あなたのonPostExecuteで。これは、コードがメイン スレッドで再び実行されることを意味し、NetworkOnMainThread exception. イメージを の変数に保存し、イメージを の にdoInBackground設定しImageViewますonPostCreate

于 2013-05-28T11:11:55.843 に答える
1

内部のこれらのコードonPostExecute(String result)

        Bitmap mIcon_val = BitmapFactory.decodeStream(newurl
                .openConnection().getInputStream());
        userphoto.setImageBitmap(mIcon_val);

をメイン スレッドで実行するか、コードを に移動するdoInBackgroundか、上記のコード用に AsyncTask をもう 1 つ作成して、最初の Asynctask で新しい AsyncTask を実行してみてくださいonPostExecute(String result)^^

于 2013-05-28T11:12:47.637 に答える