甚至在使用AsynTask时android.os.NetworkOnMainThreadException

时间:2016-01-16 12:33:52

标签: java android android-asynctask

我正在尝试使用Rest Webservice。因为我无法在UI线程中执行网络操作所以我尝试使用AsyncTask执行此操作。下面是我的AsyncTask的代码

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;
    }

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

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;
    }

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

    def file_changed ( file_chooser_widget: FileChooser )
    file:File = File.new_for_uri(file_chooser_widget.get_uri())
    try
        info:FileInfo = file.query_info (FileAttribute.ACCESS_CAN_WRITE, FileQueryInfoFlags.NONE, null)
        message ("after info")
        writable: bool = info.get_attribute_boolean (FileAttribute.ACCESS_CAN_WRITE)
        if writable is false
            _entry.set_sensitive (false)
    except e: Error
        print e.message

我是Android开发的新手,无法弄清楚上面代码的问题。请帮帮我。 如果您需要更多代码来理解,请告诉我。

1 个答案:

答案 0 :(得分:2)

在结尾处删除get()电话:

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

这阻止了主应用程序线程。

相反,请在ArrayAdapter的{​​{1}}中设置onPostExecute()

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

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

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