Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步任务和队列_Java_Android_Asynchronous_Android Asynctask - Fatal编程技术网

Java 异步任务和队列

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; 为了检查异步是否正在运行,我创建了一个布尔变量

好的,这是我第一次在Java中使用Async和Queue,所以代码可能不是最好的。。。无论如何:

我想编写一个运行HTTP请求的AsyncTask,如果用户在Async运行时发送更多请求,它会将请求添加到队列中,然后Async执行每个请求

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");
}