【问题标题】:Updating ListFragment in AsyncTask?在 AsyncTask 中更新 ListFragment?
【发布时间】:2016-11-28 19:51:37
【问题描述】:
private class AsyncCaller extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        //this method will be running on background thread so don't update UI from here
        //do your long running http tasks here,you don't want to pass argument and u can access the parent class' variable url over here
        new DummyContent().fetchData();
        return null;
    }
}

它会在“不应该抛出异常”的地方抛出运行时错误

public static void fetchData() {
    // Add some sample items.
    for (int i = 1; i <= COUNT; i++) {
        addItem(createDummyItem(i));
    }

    Authenticator.setDefault(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(
                    DummyContent.UNAME, DummyContent.PASSWORD.toCharArray());
        }
    });

    try {
        DummyContentRegistry registry = new XMLDummyContentParser(url).parse();
        for (DummyItem t: registry.getTeachers()) {
            addItem(t);
        }
    } catch (Exception e) {
        fail("Exception should not have been thrown");
    }
}

在我以类似的方式尝试 AsyncTask 之后,基本上与 Failed to call a dynamic method in a static context? 相同的问题 How to use AsyncTask correctly in Android.

07-25 05:44:12.080 21933-22106/********.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
                                                                                    Process: ***********.myapplication, PID: 21933
                                                                                    java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                                        at android.os.AsyncTask$3.done(AsyncTask.java:309)
                                                                                        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                                        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                                        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
                                                                                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                                        at java.lang.Thread.run(Thread.java:818)
                                                                                     Caused by: java.lang.AssertionError: Exception should not have been thrown
                                                                                        at org.junit.Assert.fail(Assert.java:88)
                                                                                        at ***********.myapplication.dummy.DummyContent.fetchData(DummyContent.java:58)
                                                                                        at ***********.myapplication.MainActivity$AsyncCaller.doInBackground(MainActivity.java:205)
                                                                                        at ***********.myapplication.MainActivity$AsyncCaller.doInBackground(MainActivity.java:200)
                                                                                        at android.os.AsyncTask$2.call(AsyncTask.java:295)
                                                                                        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                                                                                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                                        at java.lang.Thread.run(Thread.java:818) 

【问题讨论】:

    标签: android android-studio android-fragments dynamic android-asynctask


    【解决方案1】:

    可能在这里

    DummyContentRegistry registry = new XMLDummyContentParser(url).parse();
    for (DummyItem t: registry.getTeachers()) {
    addItem(t);
    }
    

    您对 UI 进行了一些更改(添加一些数据以列出或更改其上的一些数据)。您收到异常是因为 UI 的所有操作都应该在主线程中完成,而不是在附加线程中。这就是为什么在 AsyncTast 中有 onPostExecute 方法在完成 doInBackground 方法后对 UI 进行一些更改

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多