2016-01-21 163 views
5

我想從Dropbox中讀取具有公共共享鏈接的.txt文件。我想要做的就是讀取這個.txt文件,並在android的listview中顯示這個文件中的所有數據。從Dropbox共享鏈接讀取.txt文件Android studio

http://txt.do/5zflt(我沒有獲得放棄我目前的電腦上,所以我想用這個鏈接爲例)

該文件稱爲PersonStatus即會包含沿線的文本的東西;

Online 
Offline 
Active 
Holidays 
…. 
…. 
… 
… 
… 
… 

基本上我想要做的是使用的共享Dropbox的鏈接閱讀這段文字,在我的android上的列表視圖顯示它,但我不知道我該怎麼處理這個。我在網上搜索了教程和指南,但對於android來說是新手,我一直無法找到有用的東西;

例如,我發現這個鏈接:Read a file from dropbox OP已經提出了一個類似的問題,但沒有提供足夠的代碼來理解我如何處理這個問題。另外通過我的研究,我發現Dropbox具有Android Sync API:https://www.dropbox.com/developers-v1/sync/start/android,但是對編程來說很陌生我不太清楚如何去實現並使其工作。

我真的很感激,如果任何人都可以幫忙。提前致謝。如果我的問題不明確,請讓我知道,我會嘗試更好地解釋它。

回答

5

我把here GitHub上實現你描述的場景示例項目(我也把公共文件,結構,你的Dropbox的報道here )。裏面的項目,你會發現以下主要組件:

  1. MainActivity - 它包括一個RecyclerView將與文件內容行進行填充。爲了獲取文件內容,活動依賴於保留的片段,允許在屏幕旋轉的情況下保持下載任務(有關配置更改的詳細信息,請參閱here)。文件在創建活動後立即自動下載,但您可以使用操作欄上的SYNC按鈕強制重新下載。
  2. 下載片段 - 它是一個保留的片段,它包含用於下載文件的AsyncTask。它提供 MainActivity實現用於處理下載期間發生的特定事件(例如onPrepare,onProgress,onDownloadCompleted,onDownloadFailed)。您可以使用它們來向用戶顯示進度條或其他反饋。
  3. FileContentAdapter - 它是用於在RecyclerView中顯示文件內容的適配器。

一些限制

  • 此應用程序不集中的Dropbox。如果文件在互聯網上公開,您可以下載它,無論誰在託管它。如果您的目的是讓活動自動與Dropbox上的文件保持同步,那麼使用Dropbox SDK可能會更好,特別是如果您打算訪問Dropbox上私有的文件。
  • AsyncTask實施應該改進,例如通過實施WakeLock管理。
+0

是否有可能添加一項​​功能,將從用戶手機上放置的文件中讀取的文件中的數據保存爲緩存,然後僅從保存箱文件中查找更新,因爲這將允許用戶訪問信息而無需連接到互聯網 – Henry

+0

我嘗試過它現在看起來很棒! – Henry

+0

@Henry嗯......是的,可以保留文件的本地副本。問題在於,您可能需要在後臺實現定期文件檢索,以便在當前版本和本地版本之間進行比較。如果您的目標是使用Dropbox,最好查看Dropbox SDK,以便處理身份驗證(如果需要)以及更輕鬆地獲取更新。作爲第一步,我可以嘗試修改本地處理文件存儲的代碼。 – thetonrifles

2

在我的應用程序中,我使用此代碼來獲取共享保存箱文件的內容。我將這段代碼稱爲AsyncTask。

編輯:下面是一個簡單

public class DropboxSampleActivity extends Activity { 

private ListView listViewDropbox; 
private ArrayAdapter<String> adapter = null; 
private static String URL_FILE_DROPBOX = "https://www.dropbox.com/s/xxxxxxxxxxxx/xxxxxxxxxxxx?dl=1"; 
private ArrayList<String> listElementItem; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.activity_dropbox_list); 

    super.onCreate(savedInstanceState); 
    listViewDropbox = (ListView) findViewById(R.id.listViewDropbox); 
    DropboxItemAsyncTask dropboxItemAsyncTask = new DropboxItemAsyncTask(); 
    dropboxItemAsyncTask.execute(); 
} 

class DropboxItemAsyncTask extends AsyncTask { 

    protected Integer doInBackground(Object[] params) { 

     try { 
      listElementItem = new ArrayList<>(); 
      URLConnection conn = new URL(URL_FILE_DROPBOX).openConnection(); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "UTF-8"), 8); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       listElementItem.add(line); 
      } 
      is.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 


    @Override 
    protected void onPostExecute(Object o) { 
     if (adapter == null) { 
      adapter = new ArrayAdapter(DropboxSampleActivity.this, 
        android.R.layout.simple_list_item_1, listElementItem); 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        listViewDropbox.setAdapter(adapter); 
       } 
      }); 
     } else { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        adapter.notifyDataSetChanged(); 
       } 
      }); 

     } 
    } 
}; 

}

+0

嗨,對不起,最近的回覆。我不太確定AsyncTask是如何工作的,或者我可以如何編寫一個。請你能幫我一把。 – Henry

+0

此外,當您使用此功能從保管箱中讀取文件時,是否每秒鐘都會讀取它,或者讀取一次,然後只在文件更新/添加更多文本時纔讀取。 – Henry

+0

以及如何在閱讀完文本後顯示文本,我將在列表視圖中顯示它。你在做類似的事嗎? – Henry