Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.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 主UI和AsyncTask是否在同一线程上运行?_Java_Android_Multithreading_Android Asynctask - Fatal编程技术网

Java 主UI和AsyncTask是否在同一线程上运行?

Java 主UI和AsyncTask是否在同一线程上运行?,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我在试图显示加载消息时发现了这个问题,或者你可以在我的活动中说是进度条 我尝试在UI线程和AsyncTask中使用thread.currentThread.getId()打印线程id。两张照片都是1 如果两者都在同一个线程上运行,那么在运行复杂任务(建议在doInBackground中执行)时,我们如何更改UI(建议在onPreExecute中执行) 请解释AsyncTask执行命令在Main UiThread上运行,但doInBackground在worker thread上运行,这意味着do

我在试图显示加载消息时发现了这个问题,或者你可以在我的活动中说是进度条

我尝试在UI线程和AsyncTask中使用
thread.currentThread.getId()
打印线程id。两张照片都是1

如果两者都在同一个线程上运行,那么在运行复杂任务(建议在
doInBackground
中执行)时,我们如何更改UI(建议在
onPreExecute
中执行)


请解释
AsyncTask
执行命令在
Main UiThread
上运行,但
doInBackground
worker thread
上运行,这意味着
doInBackground()
中的
thread.currentThread.getId()
将返回不同的数字


希望这能有所帮助。

在后台,异步任务实际上使用HaMeR框架在
doInBackground()
中创建了一个新线程。因此,这实际上取决于打印线程id的位置。

doInBackground()
在后台线程上运行,并且只有在正确使用
AsyncTask
时才运行

doInBackground()
无法直接更改UI,因为它正在后台线程上运行。如果在运行
doInBackground()
时需要进行更改,请调用
publishProgress()
。这将触发对
onProgressUpdate()
的调用,该调用将在主应用程序线程上调用

例如,这个保留的片段有一个
AsyncTask
,它将通过
ArrayAdapter
列表视图添加单词,因为单词变得可用(使用
Thread.sleep()
模拟网络I/O的延迟):

/***
版权所有(c)2008-2014 Commonware,LLC
根据Apache许可证2.0版(以下简称“许可证”)获得许可;你不可以
除非符合许可证,否则请使用此文件。你可以得到一份
许可证的有效期在http://www.apache.org/licenses/LICENSE-2.0. 除非需要
根据适用法律或书面同意,根据
许可证按“原样”分发,无任何保证或条件
任何形式的,无论是明示的还是暗示的。请参阅许可证以了解具体的信息
管理许可证下的权限和限制的语言。
从《忙碌的程序员指南》到Android开发_
https://commonsware.com/Android
*/
包com.commonware.android.async;
导入android.app.ListFragment;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.SystemClock;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.Toast;
导入java.util.ArrayList;
公共类AsyncDemoFragment扩展了ListFragment{
私有静态最终字符串[]项={“lorem”、“ipsum”、“dolor”,
“坐”、“艾米特”、“康塞特图尔”、“告别”、“精英”、“摩比”,
“vel”、“ligula”、“vitae”、“arcu”、“aliquet”、“mollis”、“etiam”,
“vel”、“erat”、“Placelat”、“ante”、“porttitor”、“sodales”,
“佩伦茨克”、“奥古斯”、“普卢斯”};
私有ArrayList模型=新ArrayList();
专用ArrayAdapter适配器=null;
私有AddStringTask任务=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRetainInstance(真);
任务=新的AddStringTask();
task.execute();
适配器=
新的ArrayAdapter(getActivity(),
android.R.layout.simple\u list\u item\u 1,
模型);
}
@凌驾
已创建视图上的公共void(视图v,Bundle savedInstanceState){
super.onViewCreated(v,savedInstanceState);
getListView().SetScrollBarFadinEnabled(false);
setListAdapter(适配器);
}
@凌驾
公共空间{
如果(任务!=null){
任务。取消(false);
}
super.ondestory();
}
类AddStringTask扩展了AsyncTask{
@凌驾
受保护的空位背景(空位…未使用){
用于(字符串项:项){
如果(isCancelled())
打破
出版进度(项目);
系统时钟。睡眠(400);
}
返回(空);
}
@凌驾
受保护的void onProgressUpdate(字符串…项){
如果(!isCancelled()){
添加(第[0]项);
}
}
@凌驾
受保护的void onPostExecute(未使用的void){
Toast.makeText(getActivity(),R.string.done,Toast.LENGTH\u SHORT)
.show();
task=null;
}
}
}

(从中介绍)

您在AsyncTask的何处打印线程id?
/***
  Copyright (c) 2008-2014 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain   a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    https://commonsware.com/Android
 */

package com.commonsware.android.async;

import android.app.ListFragment;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import java.util.ArrayList;

public class AsyncDemoFragment extends ListFragment {
  private static final String[] items= { "lorem", "ipsum", "dolor",
      "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi",
      "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam",
      "vel", "erat", "placerat", "ante", "porttitor", "sodales",
      "pellentesque", "augue", "purus" };
  private ArrayList<String> model=new ArrayList<String>();
  private ArrayAdapter<String> adapter=null;
  private AddStringTask task=null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setRetainInstance(true);

    task=new AddStringTask();
    task.execute();

    adapter=
        new ArrayAdapter<String>(getActivity(),
                                 android.R.layout.simple_list_item_1,
                                 model);
  }

  @Override
  public void onViewCreated(View v, Bundle savedInstanceState) {
    super.onViewCreated(v, savedInstanceState);

    getListView().setScrollbarFadingEnabled(false);
    setListAdapter(adapter);
  }

  @Override
  public void onDestroy() {
    if (task != null) {
      task.cancel(false);
    }

    super.onDestroy();
  }

  class AddStringTask extends AsyncTask<Void, String, Void> {
    @Override
    protected Void doInBackground(Void... unused) {
      for (String item : items) {
        if (isCancelled())
          break;

        publishProgress(item);
        SystemClock.sleep(400);
      }

      return(null);
    }

    @Override
    protected void onProgressUpdate(String... item) {
      if (!isCancelled()) {
        adapter.add(item[0]);
      }
    }

    @Override
    protected void onPostExecute(Void unused) {
      Toast.makeText(getActivity(), R.string.done, Toast.LENGTH_SHORT)
           .show();

      task=null;
    }
  }
}