gpt4 book ai didi

java - Android 中的 HTTPRequest 线程

转载 作者:行者123 更新时间:2023-12-01 19:42:19 26 4
gpt4 key购买 nike

我需要我的 ArrayAdapter 加载来自 HTTP 请求的数据。

我的onCreate方法:

private Spinner spiCities;
private ArrayAdapter<String> citiesAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

new Thread() {
@Override
public void run() {
LoadCities lc = new LoadCities();
lc.execute();
}
}.start();
}

我在 Activity 中有一个内部类:

class LoadCities extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
BufferedReader br = null;

try {
URL url = new URL("http://10.0.2.2/inter/api/loadCities.php");
HttpURLConnection con = (HttpURLConnection) url.openConnection();

if ( con.getResponseCode() != 200 ) {
throw new RuntimeException( "Error: " + con.getResponseMessage() );
}

br = new BufferedReader( new InputStreamReader( con.getInputStream() ) );
} catch ( MalformedURLException e ) {
e.printStackTrace();
} catch ( IOException e ) {
e.printStackTrace();
}

if ( null == br ) {
return "[]";
}
else {
StringBuilder sb = new StringBuilder();
try {
String linha;
while ( (linha = br.readLine()) != null ) {
sb.append( linha );
}
} catch (IOException e) {
e.printStackTrace();
}

return sb.toString();
}
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);

s = s.substring(1);
s = s.substring(0, s.length()-1);

List<String> listCities = new ArrayList<>();
String s1;

for ( String aux : s.split(",") ) {
s1 = aux.substring(1);
s1 = s1.substring(0, s1.length()-1);

listaCidades.add(s1);
}

citiesAdapter = new ArrayAdapter<String>( context, android.R.layout.simple_spinner_dropdown_item, listCities);
citiesAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
spiCities.setAdapter( citiesAdapter );
}
}

错误表明“citiesAdapter”对象为空:

FATAL EXCEPTION: main Process: br.com.interativa, PID: 21386 java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.interativa/br.com.interativa.FiltrarEventoActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Object.equals(java.lang.Object)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Object.equals(java.lang.Object)' on a null object reference at br.com.inter.FilterEventActivity.loadCities(FilterEventActivity.java:183)

我做错了什么?

编辑

在发布我的问题之前,我在论坛上进行了很多研究,但确实没有找到类似的内容!

我的问题被标记为另一篇文章的重复,该文章仅询问基本和纯 Java 中的空指针。我的问题与简单的空指针无关,与通过 Android 异步中的请求/响应传入的 JSON 值无关。

最佳答案

你在AsyncTask中实例化citiesAdapter,它在后台运行,也就是说,你永远不知道它什么时候开始运行或结束。如果您尝试在 Activity 中的其他任何位置访问变量cityAdapter,则cityAdapter可能已经实例化,也可能尚未实例化。因此,您可以在 onPostExecute 方法中执行与 carsAdapter 相关的所有内容,或者等待变量实例化后再尝试使用它。

如果您确实需要等待 onPostExecute 完成才能在 Activity 中执行其他操作,那么您应该实现 onProgressUpdate通知用户您的 Activity 正在加载某些内容。

有一件事你根本不需要做。您正在创建一个线程,然后在其中运行 AsyncTask。这是完全没有必要的,因为 AsyncTask 已经为你创建了一个线程,这就是它存在的原因。因此,不要使用“new Thread()”。

关于java - Android 中的 HTTPRequest 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54928807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com