Java 为什么我总是得到NetworkOnMainThreadException?

Java 为什么我总是得到NetworkOnMainThreadException?,java,android,exception,Java,Android,Exception,我已经介绍了所有SO解决NetworkOnMainThreadException问题的解决方案,包括异步类,但仍然存在一些问题 以下是我的简单代码: ActivityMain课程: public class MainActivity extends Activity { ArrayList<City> alCities = new ArrayList<City>(); Activity activity=null; @Override p

我已经介绍了所有SO解决
NetworkOnMainThreadException
问题的解决方案,包括异步类,但仍然存在一些问题

以下是我的简单代码:

ActivityMain课程:

public class MainActivity extends Activity
{
    ArrayList<City> alCities = new ArrayList<City>();
    Activity activity=null;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity=this;

        new MyTask(activity, alCities).execute(); //<--- running ASYNC here
    }
}
public class MyTask extends AsyncTask<Void, Void, ArrayList<City>>
{
    ArrayList<City> alCities = null;
    Activity ac = null;

    public MyTask(Activity activity, ArrayList<City> al) //ctor
    {
        alCities = al;
        this.activity= activity;
    }

    @Override
    protected ArrayList<City> doInBackground(Void... params)
    {
        try
        {
            Object myJsonObject = Util.getJson("http://jsbin.com/lobel/2.js"); //internet job

                try
                {
                    //...fill array list...
                    return alCities;

                } catch (Exception e)
                {
                    ...
                }
            }
        } catch (Exception e)
        {
            ...
        }
        return null;
    }


    protected void onPostExecute(ArrayList<City> alCities)
    {
    ...
    //update UI
    ListView l1 = (ListView) ac.findViewById(R.id.list_view_1);
    ///
    }

}
它确实有效:

问题

我做错了什么

完整堆栈跟踪

我所做的就是加载json文件

onPostExecute的完整代码:

protected void onPostExecute(ArrayList<City> alCities)
    {
        CustomArrayAdapter adapter = new CustomArrayAdapter(ac, alCities);

        ListView l1 = (ListView) ac.findViewById(R.id.list_view_1);
        l1.setAdapter(adapter);
        l1.setOnItemClickListener(new OnItemClickListener()
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id)
            {
                // Util.Toast(getBaseContext(), "You have selected " + 1);

            }
        });
    }
受保护的void onPostExecute(ArrayList alCities)
{
CustomArrayAdapter=新的CustomArrayAdapter(ac、alCities);
ListView l1=(ListView)ac.findViewById(R.id.list\u view\u 1);
l1.设置适配器(适配器);
l1.setOnItemClickListener(新的OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id)
{
//Toast(getBaseContext(),“您已选择”+1);
}
});
}

从完整堆栈跟踪中,错误源在

om.example.listview3.CustomArrayAdapter.getView()
它试图从URL加载位图的位置

i、 e.
位于com.example.listview3.Util.getBitmapFromURL(Util.java:179)

onPostExecute
在主UI线程中运行,这就是为什么会出现
NetworkOnMainThreadException


您可能需要考虑使用,它可以在OKHTTP的顶部工作,并且提供了一种易于使用的加载图像的方法,而无需线程的麻烦,它从完整的堆栈跟踪中引入

< P>。
om.example.listview3.CustomArrayAdapter.getView()
它试图从URL加载位图的位置

i、 e.
位于com.example.listview3.Util.getBitmapFromURL(Util.java:179)

onPostExecute
在主UI线程中运行,这就是为什么会出现
NetworkOnMainThreadException


您可能想考虑使用,它可以在OKHTTP的顶部工作,并且提供了一种易于使用的加载图像的方法,而不需要线程的麻烦,它在

< P>中介绍:这是您的崩溃的原因:

at com.example.listview3.Util.getBitmapFromURL(Util.java:179)
at com.example.listview3.CustomArrayAdapter.getView(CustomArrayAdapter.java:67)

您已正确使用了
AsyncTask
。但是,在填写列表时,您尝试再次使用网络获取图像。这一次,您没有使用
AsyncTask
,因此出现了
NetworkOnMainThreadException

这就是崩溃的原因:

at com.example.listview3.Util.getBitmapFromURL(Util.java:179)
at com.example.listview3.CustomArrayAdapter.getView(CustomArrayAdapter.java:67)


您已正确使用了
AsyncTask
。但是,在填写列表时,您尝试再次使用网络获取图像。这一次,您没有使用
AsyncTask
,因此在检查完整堆栈跟踪时出现
networkMainThreadException

,异常发生在代码的哪一行?这一行是否在AsyncTask的
doInBackground
中?请显示完整的堆栈跟踪,并将其作为文本包含,而不是屏幕截图!你一定还有别的东西没给我们看。
onPostExecute()
中还有什么内容?很可能是您在
onPostExecute()
中执行的操作导致
okhttp
进行网络调用(可能是延迟加载调用)。粘贴它-完整堆栈跟踪问题来自这里com.example.listview3.Util.getBitmapFromURL(Util.java:179),与Json文件无关。检查完整堆栈跟踪时,在代码的哪一行发生异常?这一行是否在AsyncTask的
doInBackground
中?请显示完整的堆栈跟踪,并将其作为文本包含,而不是屏幕截图!你一定还有别的东西没给我们看。
onPostExecute()
中还有什么内容?很可能是您在
onPostExecute()
中执行的操作导致
okhttp
进行网络调用(可能是延迟加载调用)。同时粘贴她-完整堆栈跟踪问题来自这里com.example.listview3.Util.getBitmapFromURL(Util.java:179),与Json文件无关。但是代码本身在线程中运行否?我还将主调用放在一个线程中,它仍然发生。如果A调用B,A在线程内启动,那么B也..放置在
onPostExecute
中的代码不会在后台线程中运行,不会。您必须为每个图像启动另一个线程。是的,您有了它:)请注意,处理
列表视图中项目的图像加载可能会有点复杂。随着视图被回收,您需要跟踪您的请求线程以取消它们,否则您最终会得到某个项目的错误图像。是一个很好的库,它可以为您处理这个问题。但是代码本身在线程中运行没有?我还将主调用放在一个线程中,它仍然发生。如果A调用B,A在线程内启动,那么B也..放置在
onPostExecute
中的代码不会在后台线程中运行,不会。您必须为每个图像启动另一个线程。是的,您有了它:)请注意,处理
列表视图中项目的图像加载可能会有点复杂。随着视图被回收,您需要跟踪您的请求线程以取消它们,否则您最终会得到某个项目的错误图像。这是一个很好的图书馆,可以为您处理这个问题。