java - 如何从另一个 AsyncTask 停止(中止)一个 AsyncTask?

标签 java android json multithreading mobile

我的主要 Activity 有 2 个 AsyncTask,我希望其中一个 AsyncTask 中止另一个 AsyncTask

class Contador extends AsyncTask<String, String, String>{

@Override
protected void onPreExecute() {

    }

@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
     try {
            httpclientContador = new DefaultHttpClient();

            String sContador = "http://webmilab.com/SEDESOL/index.php/transferencias/conteo/" + resIdEncuesta;

            pContador = new HttpPost(sContador);


            pContador.addHeader("content-type", "application/x-www-form-urlencoded");
            JSONObject jContador = new JSONObject();
            jContador.put("mensaje", "Empezar a contar :)");

            StringEntity eContador = new StringEntity("json="+jContador.toString(), "UTF-8");
            pContador.setEntity(eContador);
            httpclientContador.execute(pContador);


        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(TransferirDatos.this, "Hubo un error al realizar la petición del conteo", Toast.LENGTH_LONG).show();

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return null;
    }

    protected void onPostExecute(String file_url) { 

        }

    }

}

这是我想要完成的 AsyncTask。

class Contador extends AsyncTask<String, String, String>{

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub

        //Some Code

        return null;
    }

    protected void onPostExecute(String file_url) { 

        pContador.abort();  

    }

}

HttpPost pContadorHttpClient httpclientContador 是在主 Activity 中定义的变量。

当我尝试执行此代码时,应用程序总是崩溃,我想知道如何中止第二个 AsyncTask 中的 AsyncTask

这是日志。

04-08 09:22:48.625: E/AndroidRuntime(10950): FATAL EXCEPTION: AsyncTask #3
04-08 09:22:48.625: E/AndroidRuntime(10950): java.lang.RuntimeException: An error occured while executing doInBackground()
04-08 09:22:48.625: E/AndroidRuntime(10950):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.lang.Thread.run(Thread.java:856)
04-08 09:22:48.625: E/AndroidRuntime(10950): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-08 09:22:48.625: E/AndroidRuntime(10950):    at android.os.Handler.<init>(Handler.java:121)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at android.widget.Toast$TN.<init>(Toast.java:317)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at android.widget.Toast.<init>(Toast.java:91)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at android.widget.Toast.makeText(Toast.java:233)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at tsp.consulting.TransferirDatos$Contador.doInBackground(TransferirDatos.java:184)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at tsp.consulting.TransferirDatos$Contador.doInBackground(TransferirDatos.java:1)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
04-08 09:22:48.625: E/AndroidRuntime(10950):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

最佳答案

您的问题是您正在尝试在 doInBackground 方法中打印 Toast。 该方法在后台线程中执行,因此无法与 UI 交互。 您可以在此处阅读更多相关内容。

您可以使用onPostExecute(Result)任务结束后通知用户的方法,或 onProgressUpdate(Progress...)在任务运行时更新。

关于java - 如何从另一个 AsyncTask 停止(中止)一个 AsyncTask?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22939209/

相关文章:

Android:在恢复时刷新 ArrayAdapter

c# - 为 DocumentDb 设置自定义 json 转换器

java - Java中禁用JButton的问题

java - 如何从 ArrayList 中获取重复值?

android - 如何在android上解析xml文件

来自另一个应用程序的Android调用方法

使用 Jersey/JAXB/Jackson 将 Java.util.Map 映射到 JSON 对象

php - 使用 json_encode() 获取空字符串

java - Morphia:如果一个对象是另一个对象的子集,两个对象可以从同一个集合中提取吗?

java - 日志4j2。无法在 zk/tomcat 6 web 项目上配置和运行