为什么我在AsyncTask上收到NetworkOnMainThreadException

问题描述 投票:0回答:1

我对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;
        }
    }
}

有什么想法吗?

java android android-asynctask
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.