当前位置: 首页 > 知识库问答 >
问题:

为什么我总是遇到NetworkOnMainThreadException?

李利
2023-03-14

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

这是我的简单代码:

活动主类别:

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
    }
}

MyTask类:

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);
    ///
    }

}

但仍然:

注意:

如果我把:

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
} 

它确实有效:

问题

我做错了什么?

完整堆栈跟踪:http://jsbin.com/bilafi/2/edit

我所做的就是加载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);

            }
        });
    }

共有2个答案

邵博远
2023-03-14

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

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

com.example.listview3. Util.getBitmapFromURL(Util.java:179)

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

您可能需要考虑使用volley,它可以在okhttp之上工作,并提供易于使用的方法来加载图像而无需线程麻烦,它是在Google IO 2013中引入的

淳于涛
2023-03-14

这就是您的崩溃所在:

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

您已经正确使用了异步任务。然而,在填写列表时,您尝试再次使用网络获取图像。这一次,您没有使用异步任务,因此出现了NetworkOnMainThreadException。

 类似资料:
  • 问题内容: 我是学习Flask的Django开发人员。我对Flask中的工作方式还很陌生。访问时,我得到的404包含以下代码。有人可以解释为什么我得到这个: 在服务器上找不到请求的URL。如果你手动输入网址,请检查拼写,然后重试。 问题答案: 你在注册处理程序之前先打电话。你应该将整个块移到脚本的底部。

  • 我已经彻底研究了所有的问题,但没有一个直接适用于我的问题。我正在循环访问用户ID数组并匹配它们以从我的firestore DB中获得一个用户。我会毫无问题地返回结果,但当我将其存储在状态数组中并运行控制台日志时,我的状态数组总是空的。第一个console.log工作并显示DB的结果。 请帮帮忙。

  • 本文向大家介绍python使用xpath中遇到: 到底是什么?,包括了python使用xpath中遇到: 到底是什么?的使用技巧和注意事项,需要的朋友参考一下 前言 大家在学习python爬虫的过程中,会发现一个问题,语法我看完了,说的也很详细,我也认真看了,爬虫还是不会写,或者没有思路,所以我的所有文章都会从实例的角度来解析一些常见的问题和报错。下面话不多说了,来一起看看详细的介绍吧。 Elem

  • 我试图获取数据,但总是使用获取。