gpt4 book ai didi

java - 即使使用 AsyncTask 也会出现 android.os.NetworkOnMainThreadException

转载 作者:行者123 更新时间:2023-12-02 04:01:41 24 4
gpt4 key购买 nike

我正在尝试使用 Rest Web 服务。由于我无法在 UI 线程中执行网络操作,因此我尝试使用 AsyncTask 执行此操作。下面是我的 AsyncTask 代码

    public class CallMeServiceAsyncTask extends AsyncTask<String, Void, List<Service>> {
@Override
protected List<Service> doInBackground(String... params) {
CallmeService service= ServiceFactory.getCallmeService();
List<Service> services= service.getAllServices(); //Calls web service and Parses Json Response
return services;
}
}

CallmeService.getAllService() 提供了一个服务层,最终调用下面的方法

public static String makeRestRequest(String url) throws MalformedURLException,IOException {
String response="";
URL restUrl= new URL(url);
HttpURLConnection connection=(HttpURLConnection)restUrl.openConnection();
InputStream is=new BufferedInputStream(connection.getInputStream());
response=convertStreamToString(is);
return response;
}

现在我从 Activity 的 onCreate 方法调用我的任务,如下所示

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.activity_home);
this.optionsList=(ListView)findViewById(R.id.optionsList);

//String[] options={"Teacher","Plumber","Electricians"};
ArrayAdapter adapter=getServiceMenu();
this.optionsList.setAdapter(adapter);
optionsList.setOnItemClickListener(this);
}
private ArrayAdapter getServiceMenu()
{
ArrayAdapter adapter= null;
try {
List<Service> menuServices= new CallMeServiceAsyncTask().execute("").get();

adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, menuServices);
}
catch(Exception x)
{
x.printStackTrace();
}
return adapter;
}

我对 Android 开发非常陌生,无法弄清楚上面的代码有什么问题。请帮帮我。如果您需要更多代码来理解,请告诉我。

最佳答案

摆脱末尾的 get() 调用:

new CallMeServiceAsyncTask().execute("").get();

这会阻塞主应用程序线程。

相反,请在 AsyncTaskonPostExecute() 中设置 ArrayAdapter

或者,使用普通线程而不是 AsyncTask,并使用事件总线将 Web 服务结果传递到 UI 层,如我在 this sample app 中演示的那样。 .

或者,使用提供更新的 HTTP API 的库,如 OkHttp,这使得异步 HTTP 操作更容易,正如我在 this sample app 中演示的那样.

或者,切换到类似 Retrofit 的库,这使得异步 REST Web 服务调用更加容易,正如我在 this sample app 中演示的那样.

关于java - 即使使用 AsyncTask 也会出现 android.os.NetworkOnMainThreadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826989/

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