2016-11-03 20 views
-2

嘗試從URL獲取文件到InputStream元素中(使用AsyncTask),然後使用它,但到目前爲止不成功。 AsyncTask的參數是否正確?我是否可以檢查InputStream,就像我在代碼中做的一樣,或者它是錯誤的,它會一直返回null?我應該做什麼其他更改?來自AsyncTask中的URL的InputStream

我的代碼:

String url = "https://www.example.com/file.txt"; 
InputStream stream = null; 

public void load() { 
    DownloadTask downloadTask = new DownloadTask(); 
    downloadTask.execute(url); 
    if (stream == null) { 
     //fail, stream == null 
    } else { 
     //success 
    } 
} 

class DownloadTask extends AsyncTask <String, Integer, InputStream> { 

@Override 
protected void onPreExecute() { 

} 

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

    try { 
     URL url = new URL(url); 
     stream = url.openStream(); 

    } catch (MalformedURLException e) { 
      e.printStackTrace(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return stream; 
} 

@Override 
protected void onPostExecute(InputStream result) { 
    super.onPostExecute(result); 
} 
} 

EDIT2: 我固定它。

public void load(){ 
    //some code 
    DownloadTask dt=new DownloadTask(); 
    dt.execute("www.example.com"); 
} 

private class DownloadTask extends AsyncTask<String,Integer,Void>{ 
    InputStream text; 

    protected Void doInBackground(String...params){ 
     URL url; 
     try { 
      url = new URL(params[0]); 
      HttpURLConnection con=(HttpURLConnection)url.openConnection(); 
      InputStream is=con.getInputStream(); 
      text = is; 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Void result){ 
     //use "text" 
    } 
} 

回答

0

您以錯誤的方式使用AsyncTask全部操作如doInBackground(String... params)方法內下載或服務器請求。

非常重要的是要知道,你應該在onPostExecute(..)方法中更新你的UI。這個方法從UI-Thread被調用。

下面是一個例子(僞代碼):

class DownloadTask extends AsyncTask <String, Integer, MyDownloadedData> { 

    private MyDownloadedData getFromStream(InputStream stream){ 
     // TODO 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

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

     try { 
      URL url = new URL(url); 
      InputStream stream = url.openStream(); 

      MyDownloadedData data = getFromStream(stream); 
      return data; 
     } catch (Exception e) { 
      // do something 
     } 
     return stream; 
    } 

    @Override 
    protected void onPostExecute(MyDownloadedData data) { 
     // 
     // update your UI in this method. example: 
     // 
     someLabel.setText(data.getName()); 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     //... 
    } 


} 
+0

我解決我的問題(編輯我的問題)。感謝提示,我需要更新onPostExecute()方法中的UI!僞代碼對於像我這樣的初學者來說有點混亂,因爲對於我的任務(在asynctask中獲取inputstream),我不需要preExecute,progressUpdate,getFromStream() - 所有這些與任務無關。 – user3671635