2011-05-09 107 views
0

我在這裏旋轉我的輪子試圖讓AsyncTask工作。我有一個連接到Web服務的方法,然後根據響應代碼設置我的textview。該方法是這樣的:試圖讓AsyncTask工作

private void connect() throws OAuthMessageSignerException, OAuthExpectationFailedException, OAuthCommunicationException, IOException { 
    OAuthConsumer consumer = new DefaultOAuthConsumer(CONSUMER_KEY, 
      CONSUMER_SECRET); 
    consumer.setTokenWithSecret("", ""); 

    // create an HTTP request to a protected resource 
    URL url = new URL("http://blablabla.com/bla.json"); 
    HttpURLConnection request = (HttpURLConnection) url.openConnection(); 

    // sign the request 
    consumer.sign(request); 

    // send the request 
    request.connect(); 
    Log.i("Pimpshit", "Response code is: " + request.getResponseMessage()); 
    if(request.getResponseCode()==200) { 
     mText.setText("Sorry, failed to connect to X"); 
    } else if(request.getResponseCode()==401) { 
     mText.setText("Congrats, you're connected to X!"); 
    } else 
     mText.setText("Whatever you're asking for, it ain't a valid HTTP request..."); 

} 

如何斷火從onCreateAsyncTask做到這一點?

回答

0

首先,我想概括調用GetData代碼複用爲:

String getData(URL url) 

第二我會讓getD

private class MyAsynch extends AsyncTask<URL,void,BoolString> 

:ATA沒有在嘗試捕捉包的getData和異常或成功

//a utility class to signal success or failure, return an error message, and return a useful String value 
//see Try Out in C# 
public final class BoolString { 
public final boolean success; 
public final String err; 
public final String value; 

public BoolString(boolean success, String err, String value){ 
    this.success= success; 
    this.err= err; 
    this.value= value; 
} 
} 

BoolString tryGetData(URL url) 

然後,我將創建一個內部類返回一個自定義對象可能拋出並稱之爲:

new MyAsynch().execute(url); 

private class MyAsynch extends AsyncTask<URL, Void, BoolString>{ 
    protected void onPreExecute() { 
     resetProgress(); 
     progress.show(); 
    } 
    @Override 
    protected BoolString doInBackground(URL...urls) { // <== DO NOT TOUCH THE UI VIEW HERE 
     // TODO Auto-generated method stub 
     URL url= url[0]; 
     return tryGetData(url); // <== return value BoolString result is sent to onPostExecute 
    } 
    protected void onPostExecute(BoolString result){   
     progress.dismiss(); 
     if (result.success){    
      editText.setText(result.value); 
     } 
     else { 
      editText.setText(""); 
      editText.setError(result.err); 
     } 
    } 
}; 
0

從OnCreate中(), (這是爲了開始異步)

new GetData(connectTextview).execute(); 

然後,你將有你的AsyncClass實現象,

public class AsyncConnect extends AsyncTask<Void, String, Void> { 
     private final TextView progress; 

     public GetData(TextView progress) { 
      this.progress = progress; 
     } 

     @Override 
     protected void onPreExecute() { 
      progress.setText("Starting...");//Added for clarity 
     } 

     @Override 
     protected Void doInBackground(Void... unused) { 

        ///Have your connection related things 
        //i.e. your connect method you can have it here. 

        publishProgress(connectionResultString); 
       } 
      @Override 
     protected void onProgressUpdate(String... data) { 

      progress.setText(data[0]); 

      progress.invalidate(); 
     } 

     @Override 
     protected void onPostExecute(Void unused) { 
      progress.setText("Finished!"); //Added for clarity 
     } 
} 
+0

你的意思是'新的AsyncConnect'嗎?另外爲什麼它使用'TextView'作爲參數?這是'TextView'將由'publishProgress(connectionResultString)更新'''? – LuxuryMode 2011-05-09 21:57:24

+0

是新的AsyncConnect。 (因爲我沒有看到您的文章中的異步代碼)。是的textview將由publishProgress更新 – m4n07 2011-05-10 04:01:31