2016-11-03 14 views
-2

(AsyncTaskを使用して)URLからInputStream要素にファイルを取得しようとして失敗しました。 AsyncTaskのパラメータは正しいですか?私は自分のコードで行ったようにInputStreamをチェックすることができますか、それとも間違っていますか?それは常にnullを返しますか?私がすべきその他の変更は?URLからAsyncTaskの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スレッドから呼び出されます。ここで

は例(擬似コード)である:

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

関連する問題