有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从URL读取数据的java Android AsyncTask返回Android。操作系统。NetworkOnMainThreadException

我是Android新手,正在为我制作的一款简单扫雷游戏制作一款全球高分功能。我使用PHP实现了highscore功能,因此它只需访问带有一些get参数的URL,分数就会自动保存。要获得类似的分数,它应该将URL的JSON内容读入字符串

我知道你不能从主线程访问网络,所以我创建了一个异步任务。然后我从我的活动中调用它

但是我仍然得到错误安卓.os.NetworkOnMainThreadException

下面是AsyncTask类

package net.as93.minesweeper.util;

import 安卓.os.AsyncTask;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Eventupdate extends AsyncTask<String, Void, Void> {

String pageContents;

@Override
protected Void doInBackground(String... url) {
    try {

        Thread.sleep(4000);

        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpGet httpGet = new HttpGet(url[0]);
        HttpResponse response = httpClient.execute(httpGet,localContext);
        String result = "";
        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

        String line = null;
        while ((line = reader.readLine()) != null) {
            result += line + "\n";
        }
        pageContents = result;

    } catch (InterruptedException e) {
        System.out.println(e);
        e.printStackTrace();


    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // TODO Auto-generated method stub
    return null;
}

public String getPageContents() {
    return pageContents;
}

}

下面是saveScore()方法,它应该调用AsyncTask

public void saveScore(ScoreObj scoreObj) throws IOException {
        String usersname = scoreObj.getUsersName();
        String time = Integer.toString(scoreObj.getTime());
        String mode = scoreObj.getGameMode();
        String timed = ((scoreObj.isTimed()) ? "true" : "false");

        String myUri = "http://安卓.as93.net/minesweeper/setscore.php?usersname="+usersname+"&time="+time+"&timed="+timed+"&mode="+mode;
        try{
            Eventupdate eu = new Eventupdate();
            eu.execute(myUri);
            eu.doInBackground(myUri);


        }catch (Exception e){System.out.println("Another error: "+e);}


    }

我已经将<uses-permission 安卓:name="安卓.permission.INTERNET"/>添加到清单中

我已经花了好几个小时试图解决这个问题,但在互联网上却找不到解决方案。提前感谢您的建议


共 (4) 个答案

  1. # 1 楼答案

    去掉这个

    eu.doInBackground(myUri);
    

    你已经有了

    eu.execute(myUri);
    

    在调用中调用execute AsyncTask时,doInbackground执行后台计算

  2. # 2 楼答案

    删除此行

    eu.doInBackground(myUri);
    
  3. # 3 楼答案

    在try块中删除eu。桃金娘

  4. # 4 楼答案

    这里的这部分是可疑的

    Eventupdate eu = new Eventupdate();
    eu.execute(myUri);
    eu.doInBackground(myUri);
    

    当你调用execute时,不要直接调用doInBackground,它会自己调用它