Android 安卓:Can';无法使用AsyncTask获取http数据
我正在创建一个新闻应用程序。通常,当我获取HTTP数据时,它可以正常工作,但现在在我的应用程序中,我使用的是RecyclerView+CardView,我已经(因此我发现了某种逻辑错误)。我尝试过使用不同的库,比如OkHttp和Reformation,但效果不太好。我完全确定我有一个核心误解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
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