2014-12-26 137 views
1

我想知道如果AsyncTaskdoInBackground方法調用方法,例如XYZ(),那麼該方法是否也異步執行?Android的AsyncTask中的doInBackground

在這種情況下,我們可以更改XYZ()中的用戶界面嗎?它會使界面無響應?

我有一個方法調用doInBackground這是網絡密集型的,需要從網上下載圖片。只要對該方法進行調用,UI就會無響應。爲什麼?

protected String[] doInBackground(String... params) 
     { 

    String[] response = new String[2]; 
    Log.v("Background", "I am in background!"); 

    String url = params[0]; 
    String VoiceInput = params[1]; 
    IsCalledOnVoiceInput = VoiceInput; 
    Log.v(url,url); 
    HttpPost httppost = new HttpPost(url); 
    try 
    { 

     HttpParams p = new BasicHttpParams(); 
     HttpClient httpclient = new DefaultHttpClient(p); 
     ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
     responseBody = httpclient.execute(httppost, 
       responseHandler); 
     Log.v("Thread", responseBody); 

     //Getting background image URL 
     JSONObject reader = new JSONObject(responseBody); 
     JSONObject coords = reader.getJSONObject("coord"); 
     loc_latitude = coords.getString("lat"); 
     loc_longitude = coords.getString("lon"); 
     String imageURL=""; 
     ///////////////////////////////////////////////////////////////////////////////// 
     try 
     { 
      imageURL = getRandomImageURL(loc_latitude,loc_longitude); 
      Log.v("Image URL as recieved from getRandomImageURL", imageURL); 
      //Trying to convert Image from the above URL, get it and theh convert it to String 
      URL urlOfTheImage = new URL(imageURL); 

      bmp = BitmapFactory.decodeStream(urlOfTheImage.openConnection().getInputStream()); 
      //Image successfully converted to string, ready to pass as a parameter! 
      response[0] = ""; 
     } 
     catch(Exception e) 
     { 
      Toast.makeText(getApplicationContext(),"There seems to be a problem with the application. Please try again later.", Toast.LENGTH_LONG).show(); 
     } 
     Log.v("URL of Random Image",imageURL); 

    } 

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

    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (JSONException e) 
    { 
     e.printStackTrace(); 

    } 

    response[1] = responseBody; 
    return response; 
} 

方法getRandomImageURL和所有代碼在try塊是網絡密集的。我也可以提供它的代碼。

+2

任何稱爲'doInBackground'方法將被異步調用。你不應該改變那裏的用戶界面。 – Rohit5k2

+0

檢查更新的問題。 –

+0

請發佈您的代碼的適當部分。已添加代碼 – Rohit5k2

回答

0

設置超時這樣的...

HttpPost httppost = new HttpPost(url); 
HttpParams httpParameters = new BasicHttpParams(); 
int timeoutConnection = 3000; 
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
int timeoutSocket = 5000; 
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 
HttpResponse response = httpClient.execute(httppost); 
+0

還有一件事,我們可以從doInBackground中顯示吐司消息嗎?我得到'不能創建處理程序內部線程沒有調用Looper.prepare()'我認爲這是原因?我對嗎? –

+1

是的,我們不能一般。如果你真的需要證明你必須這樣做。 'Looper.prepare(); Toast.makeText(MainActivity.this,「Hi」,Toast.LENGTH_LONG).show(); Looper.loop();' – Rohit5k2

2

在後臺執行的代碼在單獨的線程中運行。它所做的任何事情,包括調用其他方法,都發生在該線程中。由於這不是UI線程,因此無法進行UI調用。您必須將消息發佈到UI線程。

1

是的,無論您在doInBackgroud中調用哪種方法,都會異步運行。並且你沒有從後臺線程更新UI,因爲你有CallBackDefined(onPostExecute)。或者如果UI更新需要,您可以使用runOnUIThread(...)API

1

您只能從UI線程更改UI。一般而言,doInBackground()適用於不更新UI或訪問UI工具包的冗長操作。您可以通過調用publishProgress(),定期發佈需要在UI中反映的狀態變化(例如顯示下載操作狀態的進度條)。

相關問題