0

AsyncTask を使用してファイルをアップロードするために HttpURLConnection を使用する 1 つのアクティビティ (MainActivity) があります。それはすべてうまく機能し、ダンディです。また、JSONParser と makeHttpRequest を使用して、アップロードされたすべてのファイルのリストを MySQL データベースに照会する別のアクティビティ (ListAllFilesActivity) もあります (AsyncTask も使用)。ListAllFilesActivity アクティビティもうまく機能します。

私が直面している問題は、MainActivity から大きなファイルのファイル アップロードを開始し、ListAllFilesActivity を起動してデータベースをクエリすると、MainActivity の AsyncTask がファイルのアップロードを完了するまでデータベース クエリが結果を返さないことです (アップロードが完了するまで進行状況ダイアログを表示するだけです)。これは、接続が「解放」されるのを待っていることに関係していると思います。ファイルが MainActivity にアップロードされている間に、接続して ListAllFilesActivity から結果を取得できる方法はありますか?

どのコードを表示すればよいか正確にはわかりませんが、ここにいくつかのスニペットを示します。さらに必要な場合は、お知らせください。

MainActivity.java

fileInputStream = new FileInputStream(fileToUpload);

// open a URL connection to the Servlet
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();

// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
if (Build.VERSION.SDK_INT > 13) {
    // Needed to add this since the second attempt to upload a file would fail with an EOFException and IOException: null
    // http://stackoverflow.com/questions/3352424/httpurlconnection-openconnection-fails-second-time
    conn.setRequestProperty("Connection", "close");
}
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
// String to get length to use for setFixedLengthStreamingMode
conn.setFixedLengthStreamingMode(infoSize);

ListAllFilesActivity.java

リスト パラメータ = 新しい ArrayList(); // URL から JSON 文字列を取得

params.add(new BasicNameValuePair("access_token", mAccessToken));
params.add(new BasicNameValuePair("gplus_id", mGPlusId));
params.add(new BasicNameValuePair("id", mId));

JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

try {
    // Checking for SUCCESS TAG
    int success = json.getInt(TAG_SUCCESS);

    if (success == 1) {
        // Files found...dump them to HashMap
        // Getting Array of Products
    } 
} catch (JSONException e) {
    e.printStackTrace();
}
4

1 に答える 1

3

AsyncTaskのドキュメントから:

最初に導入されたとき、AsyncTasks は単一のバックグラウンド スレッドでシリアルに実行されました。からDONUT、これはスレッドのプールに変更され、複数のタスクが並行して動作できるようになりました。からはHONEYCOMB、並列実行によって発生する一般的なアプリケーション エラーを回避するために、タスクは単一のスレッドで実行されます。

本当に並列実行が必要な場合は、で呼び出すことができexecuteOnExecutor(java.util.concurrent.Executor, Object[])ますTHREAD_POOL_EXECUTOR

于 2013-08-01T20:18:53.570 に答える