我对Java有一点了解,并且有一个奇怪的发现,它不在主IU线程上运行网络任务。如此说来,我正在AsyncTask类中做所有事情。我在几年前所做的其他项目中也取得了成功。当我执行AsyncTask时,它给了我NetworkOnMainThreadException。我是在做错事还是需要以其他方式进行攻击。这是我的代码。
MainActivity.java-这很简单。拉入布局并执行AsyncTask
public class MainActivity extends AppCompatActivity {
private ViewPager sliderpager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sliderpager = findViewById(R.id.slider_pager);
GetTop10Movies gt10m = new GetTop10Movies(this,sliderpager);
gt10m.execute("");
}
}
JSON-AsyncTask以这种格式提取Json。我认为这不是问题
{
"Results": [{
"MovieId": 28011,
"Title": "Women of Mafia 2",
"File": "Women Of Mafia 2 - 2019.mp4"
}, {
"MovieId": 28012,
"Title": "Wonder Woman: Bloodlines",
"File": "Wonder Woman Bloodlines - 2019.mp4",
}
}
Slide.Java-只是Url,Title和Bitmap的持有人(如果需要,请告诉我)
SliderPagerAdapter.java-保存已创建的幻灯片(如果需要,请告诉我)
GetTop10Movies.java-AsyncTask
public class GetTop10Movies extends AsyncTask<String, Void, SliderPagerAdapter> {
private Exception exception;
private Context mContext;
private ViewPager sliderpager;
public GetTop10Movies(Context mContext, ViewPager rootView) {
this.mContext = mContext;
this.sliderpager = rootView;
}
protected SliderPagerAdapter doInBackground(String... urls) {
String jsonText;
try {
InputStream is = new URL(Utils.mainAPIURL + "GetTop10Movies.aspx").openStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
jsonText = readAll(rd);
JSONObject jObject = new JSONObject(jsonText);
JSONArray jArray = jObject.getJSONArray("Results");
java.util.ArrayList<Slide> lstSlides;
lstSlides = new java.util.ArrayList<Slide>();
for (int i=0; i < jArray.length(); i++) {
try {
JSONObject oneObject = jArray.getJSONObject(i);
lstSlides.add(new Slide(Utils.mainPaybillURL+oneObject.getString("File") , oneObject.getString("Title"), getBitmapFromUrl(Utils.mainPaybillURL+oneObject.getString("MovieId") + ".jpg")));
} catch (JSONException e) {}
}
SliderPagerAdapter adapter = new SliderPagerAdapter(mContext, lstSlides);
return adapter;
} catch (Exception e) {
return null;
} finally {}
}
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
protected void onPostExecute(SliderPagerAdapter adapter) {
sliderpager.setAdapter(adapter);
}
public static Bitmap getBitmapFromUrl(String surl) {
try {
URL url = new URL(surl);
/*Errors on next line*/
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
return bmp;
} catch (Exception ex) {
Bitmap bmp = null;
return bmp;
}
}
}
有什么想法吗?