Android 安卓:Can';无法使用AsyncTask获取http数据

Android 安卓:Can';无法使用AsyncTask获取http数据,android,http,parsing,android-asynctask,get,Android,Http,Parsing,Android Asynctask,Get,我正在创建一个新闻应用程序。通常,当我获取HTTP数据时,它可以正常工作,但现在在我的应用程序中,我使用的是RecyclerView+CardView,我已经(因此我发现了某种逻辑错误)。我尝试过使用不同的库,比如OkHttp和Reformation,但效果不太好。我完全确定我有一个核心误解 public class MainActivity extends AppCompatActivity { private List<Message> list; @Override prote

我正在创建一个新闻应用程序。通常,当我获取HTTP数据时,它可以正常工作,但现在在我的应用程序中,我使用的是RecyclerView+CardView,我已经(因此我发现了某种逻辑错误)。我尝试过使用不同的库,比如OkHttp和Reformation,但效果不太好。我完全确定我有一个核心误解

public class MainActivity extends AppCompatActivity {
private List<Message> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    list = new ArrayList<>();
    DownloadTask task = new DownloadTask();
    String result = null;
    try {

        result = task.execute("https://newsapi.org/v2/top-headlines?country=us&apiKey=(MyApi)").get();

    } catch (InterruptedException e) {

        e.printStackTrace();

    } catch (ExecutionException e) {

        e.printStackTrace();
    }
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);
    AtomicReference<MyCustomAdapter> adapter = null;
    adapter.set(new MyCustomAdapter(initData(result)));
    Log.i("result","Heh "+result);
    recyclerView.setAdapter(adapter.get());
}

private List<Message> initData(String myDataString) {
    representData(myDataString);
    return list;
}
private void representData(String myJSONDataString){
    JsonParser parser = new JsonParser();
    JsonObject rootObj = parser.parse(myJSONDataString).getAsJsonObject();
    JsonArray articlesArray = rootObj.getAsJsonArray("articles");
    for (JsonElement aa : articlesArray) {
        JsonObject articleObj = aa.getAsJsonObject();
        String title = articleObj.get("title").getAsString();
        String description = articleObj.get("description").getAsString();
        list.add(new Message(title,description));
    }
}
public class DownloadTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {

        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;

        try {

            url = new URL(urls[0]);

            urlConnection = (HttpURLConnection)url.openConnection();

            InputStream in = urlConnection.getInputStream();

            InputStreamReader reader = new InputStreamReader(in);

            int data = reader.read();

            while (data != -1) {

                char current = (char) data;

                result += current;

                data = reader.read();

            }

            return result;

        }
        catch(Exception e) {

            e.printStackTrace();

            return "Failed";

        }


    }

}
改变

AtomicReference适配器=null

AtomicReference适配器=新的AtomicReference()

另外,下次请仔细阅读您的错误日志。它清楚地表明您有一个
NullPointerException

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.concurrent.atomic.AtomicReference.set(java.lang.Object)' on a null object reference

使用
execute().get()
将阻塞主线程,直到任务完成@Barns,这将完全违背AsyncTask的使用,为什么在网络操作期间要阻塞主线程?这不是AsyncTask的实际工作吗?@KoushikShomChoudhury.get()就是这样做的。它等待异步任务完成。您要做的是在没有.get()的情况下调用execute()——这实际上是在后台完成的。调用.get()通常意味着此人不知道自己在做什么,也不能编写多线程代码解释:您正在创建名为adapter的
AtomicReference
实例,但没有初始化它。因此,它默认初始化为null。因此,当您对空实例调用
set
时,将抛出
NullPointerException
。为了避免这种情况,请使用
新的AtomicReference()
初始化
原子引用适配器。@koushikshoumchoudhury…从外观上看,他知道如何初始化。我要说的是,他没有读他的错误信息。答案是通过阅读错误日志来提高代码质量,而不是解释他已经知道的东西。不过,感谢您的光临:)此评论也适用于其他可能与您不具备相同知识的用户(主要是新手)。因此,如果这个答案被标记为正确,那么解释也会随之飞逝!非常感谢,先生!
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.concurrent.atomic.AtomicReference.set(java.lang.Object)' on a null object reference