2013-07-30 62 views
1

我有以下问题。在我得到了android.os.NetworkOnMainThreadException之后,我去寻找一个解决方案,并且看起来,AsyncTask是处理这个问题的最好方法。如何使用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()); 
     } 

    } 
} 

据我了解,我已经把这里的唯一事情就是

MyClassName().execute(A,B,C);

对我的CheckStatus方法。 (当按下按钮时调用此方法)

那么这条线在哪里?

私有类MyClassName延伸的AsyncTask

我现在创建一个新的类,给它一个好听的名字,然后把这个线旁

保护龙doInBackground(参数... PARAMS )

然后我的代码部分CheckStatus

这是正确的吗?

接下来的事情是,我不知道,哪些参数,所以你必须给予执行(a,b,c)调用?

有人可以给我一些代码示例,使用我的代码?我真的很感激。 我很抱歉问这么基本的问题,但我不明白它是如何工作的。

非常感谢您的帮助!

+1

阅读本机制的文档的http://开发商.android.com/reference/android/os/AsyncTask.html – Shruti

+0

[API参考](http://developer.android.com/reference/android/os/AsyncTask.html)是您处理这类问题的第一站。如果文档不符合要求,请使用您最喜爱的搜索引擎找到一些教程或示例。 –

回答

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;    
      } 
     } 
    } 

} 
0

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

异步任务是由3种一般类型,称为PARAMS,进展和结果,以及4个步骤,称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute定义。

的AsyncTask的一般类型:

Params, the type of the parameters sent to the task upon execution. 
Progress, the type of the progress units published during the background computation. 
Result, the type of the result of the background computation. 
1

首先,来看看here,然后这个例子here

所谓的“慢”代码在新创建的类的doInBackground()部分。

+0

谢谢,不知何故,我设法错过了这个例子,尽管我试图找到一个例子。我看了一下developer.android页面,但我不明白。但现在我觉得我明白了。 –

+0

不客气:) – g00dy

1

为什么不使用Google Volley(在今年的I/O中引入)。 它有一个简单的网络和远程图像加载界面。

看看吧here

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); 
} 
+0

希望这会帮助你 – Developer

相关问题