java - 为什么我不断收到 NetworkOnMainThreadException?

标签 java android exception

我已经通过所有 SO 的解决方案来解决 NetworkOnMainThreadException 包括 ASync 类 - 但仍然有问题

这是我的简单代码:

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

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

}

但还是:

enter image description here

注意:

如果我输入:

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

它确实有效:

enter image description here

问题

我做错了什么?

完整堆栈跟踪: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);

            }
        });
    }

最佳答案

这是你崩溃的地方:

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

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

关于java - 为什么我不断收到 NetworkOnMainThreadException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25877722/

相关文章:

java - 如何在java中使函数阻塞?

java - Hibernate 创建两行而不是一行

Android - 指纹信息存储在设备中的位置和安全程度

android - 使用 twilio api 调用电话?

c++ - 从构造函数抛出后调用析构函数

Android 4.0 与 Canvas.clipPath 的兼容性问题

Python abc 模块 : Extending both an abstract base class and an exception-derived class leads to surprising behavior

java - JPanel GridLayout(通过循环部分填充)将新值添加到末尾,无论它们添加的顺序如何

java - JPA 的 commit() 方法是否使实体分离?

android - Mopub 广告未显示