0

グーグルとスタックオーバーフローで何度も検索しましたが、本当に必要なものが見つかりません。asynctask メソッドを使用してファイルをサーバーにアップロードするコードを作成しました。私がしたことは次のとおりです。 ayntask メソッドで、postメソッドを使用してファイルをwebserviceにアップロードします。doInBackgroundメソッドで:

int serverResponseCode = 0;
try {

    // open a URL connection to the Servlet
    FileInputStream fileInputStream = new FileInputStream(sourceFile);

    // ------------------ CLIENT REQUEST
    URL url = new URL(upLoadServerUri);

    // Open a HTTP connection to the URL
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true); // Allow Inputs
    conn.setDoOutput(true); // Allow Outputs
    conn.setUseCaches(false); // Don't use a Cached Copy

    // Use a post method.
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Connection", "Keep-Alive");

    conn.setRequestProperty("ENCTYPE", "multipart/form-data");
    conn.setRequestProperty("Content-Type",
        "multipart/form-data;boundary=" + boundary);
    conn.setRequestProperty("file_name", fileName);
    conn.setRequestProperty("file_name_audio", fileName); 
    // conn.setFixedLengthStreamingMode(1024);
    // conn.setChunkedStreamingMode(1);

    dos = new DataOutputStream(conn.getOutputStream());

    dos.writeBytes(twoHyphens + boundary + lineEnd);

    dos.writeBytes("Content-Disposition: form-data; name=\"file_name\";filename=\""
        + fileName + "\"" + lineEnd);

    dos.writeBytes(lineEnd);


        // create a buffer of maximum size
    bytesAvailable = fileInputStream.available();

    int streamSize = (int) sourceFile.length();
    bufferSize = streamSize / 4;

    buffer = new byte[streamSize];
    int sentBytes=0;
    // read file and write it into form...
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    while (bytesRead > 0) {  
    Thread.sleep(2);  
    sentBytes += bufferSize;
    int progress = (int)((sentBytes / (float) bytesAvailable) * 100);
    publishProgress( progress+""); 
    dos.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    // bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    }

    // send multipart form data necesssary after file data...
    dos.writeBytes(lineEnd);
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

    // Responses from the server (code and message)
    serverResponseCode = conn.getResponseCode();
    @SuppressWarnings("unused")
    String serverResponseMessage = conn.getResponseMessage();

    fileInputStream.close();  
    dos.flush();
    dos.close();
    
} catch (MalformedURLException ex) {
    ex.printStackTrace();
     Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
    e.printStackTrace();
}

String serverResponseMessage = conn.getResponseMessage(); より長い時間

私のuploadprogressは4回設定されており、実際にファイルをサーバーにアップロードするのにさらに時間がかかります。コードが終了する場合に必要なのはwhileなぜですか。プログレスバーの値をより敏感に設定するにはどうすればよいですか。progressbar値を100に設定すると、ファイルのアップロードが必要になります本当に終わります。onpreexecute メソッドと onpostexecute メソッドを設定しました。でも、ここに書く必要はないと思います。また、進行状況を使用notificationbarするため、パーセンテージを表示する必要があります。

4

2 に答える 2

0

AsynTask にはオーバーライドできるメソッドがいくつかあり、そのうちの 1 つを次に示します。

void onPreExecute()
{
   //here you can show your progress bar
}

次に、タスクが完了したときに呼び出される別のメソッドがあります。

void onPostExecute(String result)
{
    //here you can dismiss your progressbar
}

さて、私の知る限り、さまざまな種類のバーを使用して進行状況を示すことができます。円を示す単純なものから、完成度の異なる横型のものまで。

丸みのあるものを表示する場合、パーセンテージを表示する必要はありませんが、水平のものを使用する場合は、いくつかの計算を行い、それに応じて設定する必要があります!

残っている作業量に応じて、doInBackground 内からプログレスバーを更新できることを忘れないでください。

これが役立つことを願っています!

于 2014-03-27T20:10:30.623 に答える
-1

これは、私のプロジェクトの 1 つで実装した手順です。このシナリオは、状況に役立つかどうかにかかわらず、役立つ場合があります。

  • ファイルをアップロードする実行可能なスレッドを作成します。このクラスには get メソッドが含まれており、このメソッドを使用してプログレス バーの値を計算します。
  • get メソッドにはロジックが含まれています (ファイルのサイズを取得し、アップロードしたデータを必要とする場合、この値からプログレス バーに使用できるパーセンタイルを取得するなど)。
  • プログレスバーの値を設定するタイマーを作成します。
  • プロセス開始直前にタイマーを開始する
  • プログレス バーの値を設定するタイマー スレッドとアップロード スレッドは、プログレス バーの値をアップロードして提供します。

私はこれを行いましたが、うまくいきました。これが少し役立つことを願っています。

ありがとう

于 2014-03-27T20:28:26.897 に答える