在 Android 中管理多个 HTTP 请求
Managing multiple HTTP requests in Android
我希望我的应用程序获取我 phone 上的所有媒体,然后将实际数据发送到我的服务器。
我在 phone 上获得了媒体的所有绝对路径,现在我想要管理请求。有没有办法制作某种请求数组,它将 运行 直到它为空?
如果可以,可以升级成优先级阵吗?例如,某人上传了 100MB 的媒体,我希望他们继续浏览我的应用程序,如果他们做了一个动作,那个特定的动作将进入那个请求数组轮询,但是优先级高?好像我要发送的下一个请求是我刚刚创建的?
我还需要它是防崩溃的,如果我的应用程序崩溃了,我仍然会知道我在哪里停止并从那里继续,而不是从头开始。
我知道有很多要求,但我没有足够的经验知道这是否可行。
就我的研究而言,这是我的解决方案。
创建一个名为 myThread
的可调用 class 它将处理请求本身,并将删除和更改我们 SQLite 数据库上请求的状态。
public class MyThread implements Callable {
private File _file;
private Context context;
private DBHelper helper;
public MyThread(File file, Context context) {
this._file = file;
this.context = context;
}
@Override
public String call() throws Exception {
HttpClient client = Utility.getNewHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost post = new HttpPost("http://192.168.9.62/mobile_api/timeline/moment/upload");
try {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
FileBody fileBody = new FileBody(_file);
builder.addPart("content", fileBody);
builder.addPart("type", new StringBody("file", ContentType.TEXT_PLAIN));
builder.addPart("title", new StringBody("service test", ContentType.TEXT_PLAIN));
builder.addPart("userType", new StringBody("user", ContentType.TEXT_PLAIN));
builder.addPart("uid", new StringBody(MyInfiActivity.friends_uid, ContentType.TEXT_PLAIN));
builder.addPart("momentId", new StringBody("1", ContentType.TEXT_PLAIN));
builder.addPart("storyId", new StringBody("8", ContentType.TEXT_PLAIN));
Utility.addCookiesToPost(post);
post.setEntity(builder.build());
client.execute(post, localContext);
} catch (IOException e) {
Log.e("Callable try", post.toString());
}
return "1";
}
一个 IntentService
创建 5 个线程(为了更好的性能......不确定它有多好),每个线程都可以 MyThread
调用以知道要删除数据库上的哪个条目整理。
@Override
protected void onHandleIntent(Intent intent) {
helper = new DBHelper(getApplicationContext());
executor = Executors.newFixedThreadPool(5);
File file;
Log.e("requestsExists",helper.requestsExists()+"");
while(helper.requestsExists()){
ArrayList<String> requestArr = helper.getRequestsToExcute(5);
//checks if the DB requests exists
if(!requestArr.isEmpty()){
//execute them and delete the DB entry
for(int i=0;i<requestArr.size();i++){
file = new File(requestArr.get(i));
Log.e("file",file.toString());
Future<String> future = executor.submit(new MyThread(file,getApplicationContext()));
Log.e("future object", future.toString());
try {
long idToDelete = Long.parseLong(future.get());
Log.e("THREAD ANSWER", future.get() + "");
helper.deleteRequest(idToDelete);
} catch (InterruptedException e) {
Log.e("future try", "");
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
executor.shutdown();
}
注意:数据是为了测试而硬编码的,将根据我将发送的媒体包含变量
我希望我的应用程序获取我 phone 上的所有媒体,然后将实际数据发送到我的服务器。
我在 phone 上获得了媒体的所有绝对路径,现在我想要管理请求。有没有办法制作某种请求数组,它将 运行 直到它为空?
如果可以,可以升级成优先级阵吗?例如,某人上传了 100MB 的媒体,我希望他们继续浏览我的应用程序,如果他们做了一个动作,那个特定的动作将进入那个请求数组轮询,但是优先级高?好像我要发送的下一个请求是我刚刚创建的?
我还需要它是防崩溃的,如果我的应用程序崩溃了,我仍然会知道我在哪里停止并从那里继续,而不是从头开始。
我知道有很多要求,但我没有足够的经验知道这是否可行。
就我的研究而言,这是我的解决方案。
创建一个名为 myThread
的可调用 class 它将处理请求本身,并将删除和更改我们 SQLite 数据库上请求的状态。
public class MyThread implements Callable {
private File _file;
private Context context;
private DBHelper helper;
public MyThread(File file, Context context) {
this._file = file;
this.context = context;
}
@Override
public String call() throws Exception {
HttpClient client = Utility.getNewHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost post = new HttpPost("http://192.168.9.62/mobile_api/timeline/moment/upload");
try {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
FileBody fileBody = new FileBody(_file);
builder.addPart("content", fileBody);
builder.addPart("type", new StringBody("file", ContentType.TEXT_PLAIN));
builder.addPart("title", new StringBody("service test", ContentType.TEXT_PLAIN));
builder.addPart("userType", new StringBody("user", ContentType.TEXT_PLAIN));
builder.addPart("uid", new StringBody(MyInfiActivity.friends_uid, ContentType.TEXT_PLAIN));
builder.addPart("momentId", new StringBody("1", ContentType.TEXT_PLAIN));
builder.addPart("storyId", new StringBody("8", ContentType.TEXT_PLAIN));
Utility.addCookiesToPost(post);
post.setEntity(builder.build());
client.execute(post, localContext);
} catch (IOException e) {
Log.e("Callable try", post.toString());
}
return "1";
}
一个 IntentService
创建 5 个线程(为了更好的性能......不确定它有多好),每个线程都可以 MyThread
调用以知道要删除数据库上的哪个条目整理。
@Override
protected void onHandleIntent(Intent intent) {
helper = new DBHelper(getApplicationContext());
executor = Executors.newFixedThreadPool(5);
File file;
Log.e("requestsExists",helper.requestsExists()+"");
while(helper.requestsExists()){
ArrayList<String> requestArr = helper.getRequestsToExcute(5);
//checks if the DB requests exists
if(!requestArr.isEmpty()){
//execute them and delete the DB entry
for(int i=0;i<requestArr.size();i++){
file = new File(requestArr.get(i));
Log.e("file",file.toString());
Future<String> future = executor.submit(new MyThread(file,getApplicationContext()));
Log.e("future object", future.toString());
try {
long idToDelete = Long.parseLong(future.get());
Log.e("THREAD ANSWER", future.get() + "");
helper.deleteRequest(idToDelete);
} catch (InterruptedException e) {
Log.e("future try", "");
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
executor.shutdown();
}
注意:数据是为了测试而硬编码的,将根据我将发送的媒体包含变量