2016-01-13 106 views
0

我想通過名爲Add的類中的http post發送字節數組中的文件。將文件發送到另一個類中的服務器

在一個名爲FileChooserActivity(擴展FragmentActivity)班,我必須選擇)稱爲onFileSelected(該文件的方法:

@Override 
    public void onFileSelected(File file) { 
     if (file != null) { 
      if (file.isDirectory()) { 
       replaceFragment(file); 
      } else { 
       finishWithResult(file); 

       setFile(file); 

       FileUtils futils = new FileUtils(); 
       try { 
        futils.fullyReadFileToBytes(file); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       Log.v("file", file.toString()); 
       Toast.makeText(FileChooserActivity.this, "File uploaded", Toast.LENGTH_SHORT).show(); 
       Intent intent=new Intent(this,AddAlerts.class); 
       intent.putExtra("file", file); 
       startActivity(intent); 

      } 
     } else { 
      Toast.makeText(FileChooserActivity.this, "Error selecting File", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public File setFile(File file){ 
     return file; 
    } 

在一類名爲文件實用程序,我必須將文件轉換爲方法一個字節數組稱爲fullyReadFileToBytes:

public byte[] fullyReadFileToBytes(File file) throws IOException { 
     Log.v("fullyReadFileToBytes", file.toString()); 

     int size = (int) file.length(); 
     byte bytes[] = new byte[size]; 
     byte tmpBuff[] = new byte[size]; 
     FileInputStream fis= new FileInputStream(file); 
     try { 

      int read = fis.read(bytes, 0, size); 
      if (read < size) { 
       int remain = size - read; 
       while (remain > 0) { 
        read = fis.read(tmpBuff, 0, remain); 
        System.arraycopy(tmpBuff, 0, bytes, size - remain, read); 
        remain -= read; 
       } 
      } 
     } catch (IOException e){ 
      throw e; 
     } finally { 
      fis.close(); 
     } 
     Log.v("bytes[]", bytes.toString()); 
     return bytes; 
    } 

在一類稱爲WebConnection,我執行發送文件所需的所有HTTP POST方法。

任何關於如何在Add類中通過http post發送文件(字節數組形式)的方法來調用FileChooserActivity的onFileSelected()方法的建議?

思考,但沒有成功,因爲文件不被抓住/從FileChooserActivity正確引用所以它是空:

在Add.class:

FileChooserActivity fca = new FileChooserActivity(); 
       File file = null; 
       fca.onFileSelected(file); 

       Log.v("file", file.toString()); 

       conn.addValuePair("a_file[]", file.toString()); 
+2

從結構上講,您的活動應該是調用其他類來執行工作的活動,而不是其他方式。不應該有任何理由必須嘗試實例化一個Activity來調用方法。如果你需要讓你的Activity在你的'Add'類完成一個動作的時候做些什麼,那麼在這種情況下,回調就是一種方法。 – NoChinDeluxe

回答

1

由於nochindeluxe說,你不應該實例化一個活動簡單地調用一種方法。

按照他的說法,在您的活動中添加一個接口,該接口將允許您設置偵聽器回調,該回調將在動作完成時運行。您可以創建一個獨立的偵聽器接口,或者將其作爲內部類添加到活動類中。我並不確定事情在這裏發生的順序,但是這應該讓你知道該怎麼做。

public interface OnFileAddedListener { 
    // your method proto here. 
    void onFileAdded(Byte[] theFile); 
} 

現在在要創建回調的類中創建一個成員變量。

private OnFileAddedListener mListener; 

爲監聽者創建一個setter。

public void setOnFileAddedListener(OnFileAddedListener listener) { 
    mListener = listener; 
} 

現在,無論你想執行這個方法(將文件添加如後),在這裏你應該實現回調。

if (mListener != null) { 
    mListener.onFileAdded(theByteArray); 
} 

現在,當您創建對象時,您可以從您的活動中調用類似這樣的設置器。

YourClass theObject = new YourClass(); 

// Set the call back from your activity. 
theObject.setOnFileAddedListener(new OnFileAddedListener() { 
    @Override 
    public void onFileAdded(Byte[] theFile) { 
     // Send your file here, in the activity, via the callback listener, using your asynctask. 
    } 
} 

希望這會有所幫助。

+0

最終使用了sharedpreferences,但我會牢記這一點。謝謝! – JohnWilliams

相關問題