Java 为什么我总是得到NetworkOnMainThreadException?
我已经介绍了所有SO解决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
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
中的代码不会在后台线程中运行,不会。您必须为每个图像启动另一个线程。是的,您有了它:)请注意,处理列表视图中项目的图像加载可能会有点复杂。随着视图被回收,您需要跟踪您的请求线程以取消它们,否则您最终会得到某个项目的错误图像。这是一个很好的图书馆,可以为您处理这个问题。