Java 异步任务和队列
好的,这是我第一次在Java中使用Async和Queue,所以代码可能不是最好的。。。无论如何: 我想编写一个运行HTTP请求的AsyncTask,如果用户在Async运行时发送更多请求,它会将请求添加到队列中,然后Async执行每个请求Java 异步任务和队列,java,android,asynchronous,android-asynctask,Java,Android,Asynchronous,Android Asynctask,好的,这是我第一次在Java中使用Async和Queue,所以代码可能不是最好的。。。无论如何: 我想编写一个运行HTTP请求的AsyncTask,如果用户在Async运行时发送更多请求,它会将请求添加到队列中,然后Async执行每个请求 private Queue<String> pasteQueue = new LinkedList<String>(); private boolean running = false; 为了检查异步是否正在运行,我创建了一个布尔变量
private Queue<String> pasteQueue = new LinkedList<String>();
private boolean running = false;
为了检查异步是否正在运行,我创建了一个布尔变量(running),在调用doInBackground时将其设置为“true”,在onPostExecute finish时将其设置为false
这是我的后台方法:
@Override
protected String doInBackground(String... params) {
Log.d(MyActivity.DEBUG_TAG, "doInBackground");
if (params[0] == null)
{
return null;
}
running = true;
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response;
String finalResponse = null;
try
{
response = httpClient.execute(new HttpGet(params[0]));
StatusLine statusLine = response.getStatusLine();
if (statusLine.getStatusCode() == HttpStatus.SC_OK)
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
response.getEntity().writeTo(outputStream);
outputStream.close();
finalResponse = outputStream.toString();
}
else
{
response.getEntity().getContent().close();
}
} catch (ClientProtocolException e) {
// ToDo: Something
} catch (IOException e) {
// ToDo: Something
}
return finalResponse; //To change body of implemented methods use File | Settings | File Templates.
}
首先,我检查params[0]是否为null(如果pasteQueue.poll()返回null),然后运行一个简单的http请求
我把完整的doInBackground放在这里,因为问题可能出在HTTP请求中(我从来没有在Android中使用过HTTP函数,是的,我对Android一般来说是新手)
然后,onPosteExecute仅限于以下内容:
@Override
protected void onPosteExecute(String s)
{
Log.d(MyActivity.DEBUG_TAG, "onPostExecute");
super.onPostExecute(s); //To change body of overridden methods use File | Settings | File Templates.
if (pasteQueue.size() > 0)
{
Log.d(MyActivity.DEBUG_TAG, "queue.size > 0, poll item");
execute(pasteQueue.poll());
}
running = false;
Log.d(MyActivity.DEBUG_TAG, "onPostExecute - fine");
}
(我删除了无用的代码)
我使用了一个运行postPaste的按钮,如果我再次按下该按钮(调用onPostExecute),应用程序将崩溃:
原因:java.lang.IllegalStateException:无法执行任务:任务已执行(一个任务只能执行一次)
11-30 18:06:50.608:错误/AndroidRuntime(2246):致命异常:主
java.lang.IllegalStateException:无法执行活动的方法
在android.view.view$1.onClick上(view.java:3599)
在android.view.view.performClick上(view.java:4204)
在android.view.view$PerformClick.run(view.java:17355)
位于android.os.Handler.handleCallback(Handler.java:725)
位于android.os.Handler.dispatchMessage(Handler.java:92)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:5041)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.reflect.InvocationTargetException
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在android.view.view$1.onClick上(view.java:3594)
... 还有11个
原因:java.lang.IllegalStateException:无法执行任务:任务已执行(只能执行任务
(一次)
位于android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578)
在android.os.AsyncTask.execute(AsyncTask.java:534)
位于com.revonline.pastebin.pastebin.postaste(pastebin.java:65)
位于com.revonline.pastebin.MyActivity.sharePaste(MyActivity.java:132)
... 14多
有什么问题?AsyncTask不适合这种情况?我应该使用普通线程代码吗
我读了一个问题,其中一个问题说异步任务可能仍会运行5秒,但我认为这不是同一个问题
有什么问题
您需要为每个execute()
调用创建一个新的AsyncTask
实例。不能在同一个AsyncTask
实例上调用execute()
两次
AsyncTask不适合这种情况
我不会在这里用的
我应该使用普通线程代码吗
我会使用
IntentService
。它已经有了一个背景线程。它已经有一个队列了。如果你的应用程序移到后台,它将比异步任务更可靠,因为Android不太可能立即终止你的进程。谢谢,现在一切正常。我在onCreate中执行了registerReceiver
,以在应用程序中显示带有HTTP请求结果的AlertDialog,但onCreate被多次调用。。当我需要无故停止广播时?暂停和恢复?
@Override
protected void onPosteExecute(String s)
{
Log.d(MyActivity.DEBUG_TAG, "onPostExecute");
super.onPostExecute(s); //To change body of overridden methods use File | Settings | File Templates.
if (pasteQueue.size() > 0)
{
Log.d(MyActivity.DEBUG_TAG, "queue.size > 0, poll item");
execute(pasteQueue.poll());
}
running = false;
Log.d(MyActivity.DEBUG_TAG, "onPostExecute - fine");
}