1

次の問題があります。android.os.NetworkOnMainThreadException を取得した後、解決策を探しましたが、AsyncTask がこれを処理する最良の方法です。

しかし、いくつかのページを読んだ後でも、AsyncTask の実装方法がわかりません。

最初に、私がこれまでに知っていることを質問とともに説明します。

ここで、Web サービスを呼び出そうとします。

package net.frontend.androidapp.statusrequest;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class PurchaseRequisitionRequest extends Activity {


     private String METHOD_NAME = "parser" ; 
     private String NAMESPACE = "http://statusrequest.androidapp.webservice.backend.net";
     private String SOAP_ACTION = NAMESPACE + METHOD_NAME;  
     private static final String URL = "http://10.35.105.31:8080/SAPInterfaceWebservice/services/XMLTransfromer?wsdl";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.purchase_requisition_request_activity);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.purchase_requisition_request, menu);
        return true;
    }

    public void checkStatus (View view) {



         try
         {
         SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
         EditText edit = (EditText) findViewById (R.id.prRequest);
            String s= edit.getText().toString();
            long lineNr=Long.parseLong(s);
         request.addProperty("lineNr", lineNr); 

         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
         envelope.dotNet = true;
         envelope.setOutputSoapObject(request);
         HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
         androidHttpTransport.call(SOAP_ACTION,envelope);
         Object result = envelope.getResponse();
         String hString = result.toString();
         String[] details = hString.split(",");

         ((TextView) findViewById (R.id.request_detail1)).setText("PR_Number: " +details[0].substring(1));
         ((TextView) findViewById (R.id.request_detail2)).setText("Result1: " +details[1]);
         ((TextView) findViewById (R.id.request_detail3)).setText("Result2: " +details[2]);
         ((TextView) findViewById (R.id.request_detail4)).setText("Result3: " +details[3]);
         ((TextView) findViewById (R.id.request_detail5)).setText("Entered Number: " + lineNr);
         } catch (Exception E) {
         E.printStackTrace();
         ((TextView) findViewById (R.id.request_detail1)).setText("ERROR: "    + E.getClass().getName() + " : " + E.getMessage()); 
         }  

    }
}

私が理解している限り、ここに入れなければならない唯一のものは

new MyClassName ().execute(a, b, c);

私のCheckStatusメソッドで。(このメソッドは、ボタンが押されたときに呼び出されます)

では、この行はどこに行くのでしょうか?

プライベート クラスMyClassNameは AsyncTask を拡張します

ここで、新しいクラスを作成し、適切な名前を付けてから、次の行を追加します

protected Long doInBackground(Params... params)

そして私のCheckStatusのコード部分。

ここまででいいの?

次は、execute(a,b,c) 呼び出しを実行する必要があるパラメーターはどれかわかりません。

誰かが私のコードを使用してコード例を教えてもらえますか? 本当に感謝します。基本的な質問で申し訳ありませんが、仕組みがわかりません。

ご協力ありがとうございました!

4

5 に答える 5

3
    public class PurchaseRequisitionRequest extends Activity {


        private String METHOD_NAME = "parser" ; 
        private String NAMESPACE = "http://statusrequest.androidapp.webservice.backend.net";
        private String SOAP_ACTION = NAMESPACE + METHOD_NAME;  
        private static final String URL = "http://10.35.105.31:8080/SAPInterfaceWebservice/services/XMLTransfromer?wsdl";

        String Error_Msg = "";

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.purchase_requisition_request_activity);

            new asyncTask().execute();

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.purchase_requisition_request, menu);
            return true;
        }

        private class asyncTask extends AsyncTask<Void, Void, Boolean> 
        {
            ProgressDialog pd;

            protected void onPreExecute() 
            {
                pd.setTitle("Please Wait...");
                pd.setMessage("Saving...");
                pd.setCancelable(false);
                pd.show();
            } 
            protected void onPostExecute(Boolean result)
            {
                if(result)
                {
                    ((TextView) findViewById (R.id.request_detail1)).setText("PR_Number: " +details[0].substring(1));
                    ((TextView) findViewById (R.id.request_detail2)).setText("Result1: " +details[1]);
                    ((TextView) findViewById (R.id.request_detail3)).setText("Result2: " +details[2]);
                    ((TextView) findViewById (R.id.request_detail4)).setText("Result3: " +details[3]);
                    ((TextView) findViewById (R.id.request_detail5)).setText("Entered Number: " + lineNr);
                }
                else
                {
                    ((TextView) findViewById (R.id.request_detail1)).setText(Error_Msg);
                }
                if(pd.isShowing()) pd.dismiss();
            } 

            @Override
            protected Boolean doInBackground(Void... params) 
            {
                try
                {
                    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                    EditText edit = (EditText) findViewById (R.id.prRequest);
                    String s= edit.getText().toString();
                    long lineNr=Long.parseLong(s);
                    request.addProperty("lineNr", lineNr); 

                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                    envelope.dotNet = true;
                    envelope.setOutputSoapObject(request);
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                    androidHttpTransport.call(SOAP_ACTION,envelope);
                    Object result = envelope.getResponse();
                    String hString = result.toString();
                    String[] details = hString.split(",");

                    Error_Msg = hString;

                } catch (Exception E) 
                {
                    E.printStackTrace();
                    Error_Msg = "ERROR: "    + E.getClass().getName() + " : " + E.getMessage();
                }   
                return true;
            }
            else
            {
                return false;               
            }
        }
    }

}
于 2013-07-30T10:47:54.180 に答える
1

まず、ここを見て、次にこの例をここで見てください。

いわゆる「遅い」コードdoInBackground()は、新しく作成されたクラスの一部になります。

于 2013-07-30T10:34:39.323 に答える
1

Google Volley を使用してみませんか (今年の I/O で導入)。ネットワーキングとリモート イメージ読み込みのためのシンプルなインターフェイスを備えています。

ここでチェックしてください

于 2013-07-30T10:36:10.213 に答える
0

クラスを作成し、これを使用します

public class RequestClient extends AsyncTask<String, Void, String>{
       Context context;
       CallBack callBack;

       public RequestClient(CallBack callBack) {
               this.callBack = callBack;
       }

       @Override
       protected void onPreExecute() {
               super.onPreExecute();

       }

      @Override
       protected String doInBackground(String... params) {
          String responseString="";
          HttpClient client = null;
          try {
              client = new DefaultHttpClient();  
              HttpGet get = new HttpGet(LoginPage.url);
              client.getParams().setParameter("http.socket.timeout", 6000);
              client.getParams().setParameter("http.connection.timeout", 6000);
              HttpResponse responseGet = client.execute(get);  
              HttpEntity resEntityGet = responseGet.getEntity();  
              if (resEntityGet != null) {  
                  responseString = EntityUtils.toString(resEntityGet);
                  Log.i("GET RESPONSE", responseString.trim());
               }
            } catch (Exception e) {
                Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString());
            }
            Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim());
            client.getConnectionManager().shutdown();
            return responseString.trim();
        }

       @Override
       protected void onPostExecute(String result) {
               // TODO Auto-generated method stub
               super.onPostExecute(result);
               callBack.run(result);

       }
}

そしてメインクラス

public  void postHttpRequest(final String userId,final String pass,final TextView error){
        url = "";
        Log.d("URL", url);
        RequestClient reqClient = new RequestClient(new CallBack() {

            @Override
            public void run(Object result) {
                try {
                    AppResponse =(String)result;


                } catch (Exception e) {
                    Log.e("Exception Occured", "Exception is "+e.getMessage());
                }
            }
        });
        reqClient.execute(url);
    }

このようなインターフェースを作成します

public interface CallBack {
    void run(Object result);
}
于 2013-07-30T10:36:57.327 に答える