【问题标题】:Accessing fragment objects from AsyncTask separate thread从 AsyncTask 单独线程访问片段对象
【发布时间】:2018-05-04 01:40:10
【问题描述】:

我正在从片段中调用 asyncTask 来进行网络连接。在它运行时,我需要能够禁用片段中的按钮,直到 AsyncTask 调用 onPostExecute。

我唯一的问题是我无法从 doInBackground 访问这样的按钮:

Button mButtom = mActivity.findViewById(R.id.testButton);

它提出了:

java.lang.RuntimeException: An error occured while executing doInBackground()
     at android.os.AsyncTask$3.done(AsyncTask.java:300)
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
     at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalStateException: The current thread must have a looper!

【问题讨论】:

    标签: android android-fragments android-asynctask java-threads


    【解决方案1】:

    我们的函数叫做 runOnUIThread

    @Override protected String doInBackground(String... strings) {
        activity.runOnUiThread(new Runnable() {
          @Override public void run() {
        //do your action
          }
        });
        return "";
      }
    

    【讨论】:

    • 谢谢,效果很好!但是出于好奇,您能解释一下“当前线程必须有一个活套!”是什么意思吗?方法。我查找了 Android loopers,但没有得到任何概念。
    【解决方案2】:

    要从 AsyncTask 与 UI 交互,请覆盖 onPreExecuteonPostExecuteonProgressUpdate 中的一个或多个。每当您在doInBackground 中调用publishProgress 时,都会调用后者。

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      相关资源
      最近更新 更多