2014-02-25 33 views
0

我有我的主類中的代碼:的AsyncTask機器人 - 爲ExecutionException錯誤

public class vurlDownloader extends AsyncTask<Void, Void, String> { 

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

     HttpClient httpClient = new DefaultHttpClient(); 
     HttpContext localContext = new BasicHttpContext(); 
     HttpGet httpGet = new HttpGet("http://url/video.html"); 
     HttpResponse response = null; 
     try { 
      response = httpClient.execute(httpGet, localContext); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     String result = ""; 

     BufferedReader reader = null; 
     try { 
      reader = new BufferedReader(
        new InputStreamReader(
          response.getEntity().getContent() 
        ) 
      ); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     String line = null; 
     try { 
      while ((line = reader.readLine()) != null){ 
       result += line + "\n"; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return result; 

    } 

} 

public String loadVurl(){ 
    String output = new vurlDownloader().execute().get(); 
    return output; 
} 

,並在此行
String output = new vurlDownloader().execute().get();
Android的工作室給我奇怪的引用(紅色下劃線): 未處理的異常: java.lang.InterruptedException, java.util.concurrent.Execution.Exception

我不太明白這一點,因爲我有類似於這裏的情況:How to get a string back from AsyncTask?和這個人的作品。

問候!

+0

您能否提供更詳盡的堆棧跟蹤以查看其失敗的位置?另外,「Void」可能被認爲是一種類型,而你可能是指「無效」,我不確定AsyncTask支持。 – Vince

+0

使用onPostExecute(),而不是get(); – Skynet

+0

**從不**使用'.get()' - 它使asynctask完全無用 – zapl

回答

1

get() throws java.lang.InterruptedException。你需要有一個嘗試捕捉並對付那些

http://developer.android.com/reference/android/os/AsyncTask.html#get()

public final Result get() 

Added in API level 3 
Waits if necessary for the computation to complete, and then retrieves its result. 

Returns 
The computed result. 
Throws 
CancellationException If the computation was cancelled. 
ExecutionException If the computation threw an exception 
InterruptedException If the current thread was interrupted while waiting. 

但你不應該使用get,因爲它阻止UI線程等待結果。這使得AsyncTask不再是異步的。

解決方案

new vurlDownloader().execute() 

,您可以在onPostExecute UI更新,如果是的AsyncTask一個內部類或使用接口作爲回調的活動。

檢查blackbel的回答@

How do I return a boolean from AsyncTask?

一個建議:遵循Java命名約定與VurlDownloader()重命名vurlDownloader()。類名以大寫開頭

編輯:

要調用

vurlDownloader().execute(); 

然後

class vurlDownloader() extends AsyncTask<Void,Void,String> 
{ 

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

     String _response= null; 

        try { 
         HttpClient httpClient = new DefaultHttpClient(); 
         HttpContext localContext = new BasicHttpContext(); 
         HttpGet httpGet = new HttpGet("http://informat.net.pl/krachapp/video.html"); 
         HttpResponse response = null; 
         response = httpClient.execute(httpGet, localContext); 
         _response = EntityUtils.toString(response.getEntity()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        }  



     return _response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     Log.i("Result is",result); 
    } 

} 
+0

@Ragunandan好吧,我按照你的想法,但我有問題:當我在'onPostExecute'中編寫UI更改時,存在來自YouTubeAPI的方法'getSupportFragmentManager'的問題。它只是'不能解決方法' – wzieba

+0

這不是一種方法。其支持庫中的片段管理器 – Raghunandan

+0

@tuksiarz發佈整個代碼並再次檢查編輯 – Raghunandan

1

試圖實現您的的AsyncTask這種方式,你可以得到Result串入onPostExecute()onBackground(...)方法返回

private class vurlDownloader() extends AsyncTask<String, Void, String> { 

@Override 
protected String doInBackground(String... params) { 
    try { 
     String _result= null; 

       try { 
        HttpClient httpClient = new DefaultHttpClient(); 
        HttpContext localContext = new BasicHttpContext(); 
        HttpGet httpGet = new HttpGet("http://informat.net.pl/krachapp/video.html"); 
        HttpResponse response = null; 
        response = httpClient.execute(httpGet, localContext); 
        _result = EntityUtils.toString(response.getEntity()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       }  

    } catch (InterruptedException e) { 
     Log.e("LongOperation", "Interrupted", e); 
     return "Interrupted"; 
    } 
    return _result; 
}  

@Override 
protected void onPostExecute(String result) {    
    system.out.print(result); 

} 
} 

並稱爲

new vurlDownloader().execute() 

轉到這個瞭解更多信息:http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html

+1

我仍然不知道如何從此AsyncTask中恢復字符串「結果」。 'String output = new vurlDownloader()。execute();'不工作(它不是字符串,不是嗎?) – wzieba

+0

@tuksiarz你仍然出錯。你直接調用你的'AsyncTask'就像'new vurlDownloader()。execute()'和'AsyncTask'在內部返回'Result'的值到'onPostExecute()' –

+0

@MD asynctask不會一次返回值。 doInbackground計算的結果是'onPostExecute'的參數。 onPostExecute提供了一個內部類的活動,可以更新ui。如果它在一個不同的類,那麼你需要尋找不同的方式 – Raghunandan

0

添加新貼在你的異步任務執行方法

@Override 
protected void onPostExecute(String result) { 
     Log.d("RESULT", "Result : " + result); 
     finalResult = result; // here finalResult is string variable declared at class level 

} 

添加另外一種方式就是回報異步任務的最終結果。

public String getFinalResult() { 
     return finalResult; 
    } 

當您需要最終結果時,您可以使用getFinalResult方法來獲取。

+0

所以我做了:在'onCreate'方法我寫了'new vurlDownloader(); VideoURL = vurlDownloader.loadVurl();'我得到的消息是我無法從靜態上下文中引用。 – wzieba

+0

.loadVurl();在這種情況下爲getFinalResult() – wzieba

+0

完成異步任務執行後,可以調用getFinalResult來檢索異步任務的結果。 – Solution